يؤسفني أن أقول إن القفل لم تتم صيانته حاليًا. لن أتمكن من تقديم الدعم أو قبول مساهمات جديدة في الوقت الحالي. الأولويات الأخرى تمنعني من وضع العمل في مكانه الذي يستحقه. في نهاية المطاف سأحاول استئناف العمل مرة أخرى ولكن لسوء الحظ لا أستطيع أن أقول متى. أتوجه بالشكر إلى جميع المساهمين والمستخدمين.
-- يجف
Lock عبارة عن حزمة Acl مرنة تعتمد على برنامج التشغيل لـ PHP 5.4+ .
تم إنشاؤها بواسطة دريس فينتس. أصبح ممكنا بفضل BeatSwitch. مستوحاة من السلطة لماثيو ماتشوغا. شعار جيري لو.
Lock
: مثيل ACL لموضوع ما. تأتي هذه الحزمة حاليًا مع CallerLock
و RoleLock
Caller
: كائن هوية يمكن أن يكون لديه أذونات للقيام بشيء ماDriver
: نظام تخزين للأذونات التي يمكن أن تكون ثابتة أو مستمرةPermission
: يحتوي الإذن على إجراء ومورد اختياري (فريد). يمكن أن يكون إما Restriction
أو Privilege
Restriction
: يمنعك التقييد من القدرة على تنفيذ إجراء ما (على مورد اختياري)Privilege
: امتياز يسمح لك بتنفيذ إجراء (على مورد اختياري)Action
: الإجراء هو شيء يُسمح لك بفعله أو يُمنع منك القيام بهResource
: يمكن أن يكون المورد كائنًا يمكنك تنفيذ إجراء واحد أو أكثر عليه. ويمكنه إما استهداف نوع معين من الموارد أو مورد معين من خلال معرفه الفريدRole
: يمكن أن يحمل الدور أيضًا أذونات متعددة. يمكن أن يكون للمتصل أدوار متعددة. يمكن للأدوار أن ترث الأذونات من الأدوار الأخرى يختلف القفل عن حزم ACL الأخرى من خلال محاولة توفير الطريقة الأكثر مرونة للعمل مع طالبي الأذونات المتعددة وتخزين الأذونات.
من خلال العمل مع عقد Lock's Caller
، يمكنك تعيين الأذونات على هويات متعددة.
يتيح عقد Driver
طريقة سهلة لتخزين الأذونات لنظام تخزين ثابت أو ثابت. يأتي ArrayDriver
الافتراضي مع هذه الحزمة. قم بمراجعة القائمة أدناه للحصول على المزيد من برامج التشغيل التي تم إعدادها لك بالفعل. أو قم ببناء سيارتك الخاصة من خلال تنفيذ عقد Driver
.
يمكنك تعيين أذونات الموارد والتحقق منها عن طريق تمرير نوع المورد والمعرف (الاختياري) يدويًا أو يمكنك تنفيذ عقد Resource
على الكائنات الخاصة بك حتى تتمكن من تمريرها لقفلها بسهولة أكبر.
يتيح Manager
طريقة سهلة لإنشاء مثيلات Lock
جديدة أو تعيين أسماء مستعارة للإجراءات أو تسجيل الأدوار.
إذا كنت بحاجة إلى تطبيق خاص بإطار عمل معين، فاختر أحد برامج التشغيل المعدة بالفعل أدناه.
قم بتثبيت هذه الحزمة من خلال Composer.
$ composer require beatswitch/lock
كل هوية يجب أن يكون لديها أذونات للقيام بشيء ما يجب أن تنفذ عقد BeatSwitchLockCallersCaller
. يحدد عقد Caller
هوية المتصل من خلال مطالبته بإرجاع نوعه ومعرفه الفريد. دعونا نلقي نظرة على مثال أدناه.
<?php
use BeatSwitch Lock Callers Caller ;
class User implements Caller
{
public function getCallerType ()
{
return ' users ' ;
}
public function getCallerId ()
{
return $ this -> id ;
}
public function getCallerRoles ()
{
return [ ' editor ' , ' publisher ' ];
}
}
من خلال إضافة وظيفة getCallerType
يمكننا التعرف على مجموعة من المتصلين من خلال نوع فريد. إذا أردنا في مرحلة ما تعيين أذونات لمجموعة أخرى من المتصلين، فيمكننا بسهولة تنفيذ العقد على كائن آخر.
<?php
use BeatSwitch Lock Callers Caller ;
class Organization implements Caller
{
public function getCallerType ()
{
return ' organizations ' ;
}
public function getCallerId ()
{
return $ this -> id ;
}
public function getCallerRoles ()
{
return [ ' enterprise ' ];
}
}
وبالتالي يمكننا بسهولة استرداد الأذونات لنوع معين من المتصلين من خلال برنامج التشغيل.
إذا كنت ترغب في تكوين كافة الأذونات الخاصة بك مسبقًا، فيمكنك استخدام ArrayDriver
الثابت الذي يأتي مع الحزمة. يتيح لك هذا تعيين قائمة الأذونات للمتصل قبل تشغيل التطبيق الخاص بك.
use BeatSwitch Lock Drivers ArrayDriver ;
use BeatSwitch Lock Lock ;
use BeatSwitch Lock Manager ;
// Create a new Manager instance.
$ manager = new Manager ( new ArrayDriver ());
// Instantiate a new Lock instance for an object which implements the Caller contract.
$ lock = $ manager -> caller ( $ caller );
// Set some permissions.
$ lock -> allow ( ' manage_settings ' );
$ lock -> allow ( ' create ' , ' events ' );
// Use the Lock instance to validate permissions on the given caller.
$ lock -> can ( ' manage_settings ' ); // true: can manage settings
$ lock -> can ( ' create ' , ' events ' ); // true: can create events
$ lock -> cannot ( ' update ' , ' events ' ); // true: cannot update events
$ lock -> can ( ' delete ' , ' events ' ); // false: cannot delete events
يتيح لك العمل مع برنامج التشغيل الدائم تخزين الأذونات على طبقة تخزين ثابتة وتعديلها أثناء وقت التشغيل. على سبيل المثال، إذا قمت بتنفيذ برنامج تشغيل Laravel 5، فسيقوم بتخزين الأذونات في قاعدة بيانات باستخدام مكون قاعدة بيانات Laravel. من خلال إنشاء واجهة المستخدم الخاصة بك، يمكنك بسهولة إرفاق وظيفة ACL من هذه الحزمة لإنشاء، على سبيل المثال، نظام إدارة مستخدم حيث يكون للمستخدمين المختلفين أذونات مختلفة.
دعونا نلقي نظرة على وحدة تحكم إدارة المستخدم الأساسية للغاية لنرى كيف يتم ذلك. سنفترض أننا حصلنا على مثيل مدير قفل تم تشغيله باستخدام برنامج تشغيل Laravel DB الخاص بنا.
<?php
use BeatSwitch Lock Manager ;
class UserManagementController extends BaseController
{
protected $ lockManager ;
public function __construct ( Manager $ lockManager )
{
$ this -> lockManager = $ lockManager ;
}
public function togglePermission ()
{
$ userId = Input:: get ( ' user ' );
$ action = Input:: get ( ' action ' );
$ resource = Input:: get ( ' resource ' );
$ user = User:: find ( $ userId );
$ this -> lockManager -> caller ( $ user )-> toggle ( $ action , $ resource );
return Redirect:: route ( ' user_management ' );
}
}
في كل مرة يتم فيها استخدام أسلوب togglePermission
، سيتم تبديل إذن المستخدم للإجراء المحدد ونوع المورد.
يمكنك إما allow
للمتصل أو deny
القيام بشيء ما. فيما يلي طريقتان لتعيين الأذونات والتحقق منها.
السماح للمتصل بإنشاء كل شيء.
$ lock -> allow ( ' create ' );
$ lock -> can ( ' create ' ); // true
السماح للمتصل بإنشاء المشاركات فقط.
$ lock -> allow ( ' create ' , ' posts ' );
$ lock -> can ( ' create ' ); // false
$ lock -> can ( ' create ' , ' posts ' ); // true
السماح للمتصل بتحرير منشور محدد فقط بمعرف 5.
$ lock -> allow ( ' edit ' , ' posts ' , 5 );
$ lock -> can ( ' edit ' ); // false
$ lock -> can ( ' edit ' , ' posts ' ); // false
$ lock -> can ( ' edit ' , ' posts ' , 5 ); // true
اسمح للمتصل بتحرير جميع المشاركات ولكن امنعه من تحرير واحدة بمعرف 5.
$ lock -> allow ( ' edit ' , ' posts ' );
$ lock -> deny ( ' edit ' , ' posts ' , 5 );
$ lock -> can ( ' edit ' , ' posts ' ); // true
$ lock -> can ( ' edit ' , ' posts ' , 5 ); // false
تبديل قيمة الإذن.
$ lock -> allow ( ' create ' );
$ lock -> can ( ' create ' ); // true
$ lock -> toggle ( ' create ' );
$ lock -> can ( ' create ' ); // false
يمكنك السماح بإجراءات متعددة أو رفضها مرة واحدة وكذلك التحقق من إجراءات متعددة مرة واحدة.
$ lock -> allow ([ ' create ' , ' edit ' ], ' posts ' );
$ lock -> can ( ' create ' , ' posts ' ); // true
$ lock -> can ([ ' create ' , ' edit ' ], ' posts ' ); // true
$ lock -> can ([ ' create ' , ' delete ' ], ' posts ' ); // false
يمكنك بسهولة مسح الأذونات لمجموعة محددة من الإجراءات والموارد.
$ lock -> allow ([ ' create ' , ' edit ' ], ' posts ' );
$ lock -> clear ( ' edit ' , ' posts ' );
$ lock -> can ( ' edit ' , ' posts ' ); // false
$ lock -> can ( ' create ' , ' posts ' ); // true
يمكنك أيضًا مسح كافة الأذونات الخاصة بمثيل القفل.
$ lock -> allow ( ' manage-posts ' );
$ lock -> allow ([ ' create ' , ' edit ' ], ' users ' );
$ lock -> clear ();
$ lock -> can ( ' manage-posts ' ); // false
$ lock -> can ( ' create ' , ' users ' ); // false
لتجميع إجراءات متعددة وتعيينها جميعًا مرة واحدة، قد ترغب في تعيين اسم مستعار للإجراء.
$ lock -> alias ( ' manage ' , [ ' create ' , ' read ' , ' delete ' ]);
$ lock -> allow ( ' manage ' , ' posts ' );
$ lock -> can ( ' manage ' , ' posts ' ); // true
$ lock -> can ( ' create ' , ' posts ' ); // true
$ lock -> can ( ' delete ' , ' posts ' , 1 ); // true
$ lock -> can ( ' update ' , ' posts ' ); // false
يمكنك بسهولة تعيين متصل لديه جميع الأذونات لكل شيء عن طريق تمرير all
أحرف البدل كإجراء على مثيل القفل.
$ lock -> allow ( ' all ' );
الآن سيتم التحقق من صحة كل استدعاء للأسلوب "can" بالنسبة لهذا المتصل.
يوفر القفل طريقة سهلة للتعامل مع الأدوار. يمكنك العمل مع الأدوار خارج الصندوق، ولكن إذا كنت تريد العمل مع الوراثة، فستحتاج إلى تسجيل الأدوار في مثيل المدير.
$ manager -> setRole ( ' guest ' );
$ manager -> setRole ( ' user ' , ' guest ' ); // "user" will inherit all permissions from "guest"
أو قم بتسجيل أدوار متعددة في وقت واحد.
$ manager -> setRole ([ ' editor ' , ' admin ' ], ' user ' ); // "editor" and "admin" will inherit all permissions from "user".
لنقم بتعيين بعض الأذونات ونرى كيف يتم حلها.
// Allow a guest to read everything.
$ manager -> role ( ' guest ' )-> allow ( ' guest ' , ' read ' );
// Allow a user to create posts.
$ manager -> role ( ' user ' )-> allow ( ' create ' , ' posts ' );
// Allow an editor and admin to publish posts.
$ manager -> role ( ' editor ' )-> allow ( ' publish ' , ' posts ' );
$ manager -> role ( ' admin ' )-> allow ( ' publish ' , ' posts ' );
// Allow an admin to delete posts.
$ manager -> role ( ' admin ' )-> allow ( ' delete ' , ' posts ' );
// Let's assume our caller has the role of "editor" and check some permissions.
$ lock = $ manager -> caller ( $ caller );
$ lock -> can ( ' read ' ); // true
$ lock -> can ( ' delete ' , ' posts ' ); // false
$ lock -> can ( ' publish ' ); // false: we can't publish everything, just posts.
$ lock -> can ([ ' create ' , ' publish ' ], ' posts ' ); // true
الشيء الذي يجب أن تكون على دراية به هو أن الأذونات على مستوى المتصل تحل محل أذونات مستوى الدور. دعونا نرى كيف يعمل ذلك.
سيكون للمتصل دور المستخدم.
$ manager -> caller ( $ caller )-> allow ( ' create ' , ' posts ' );
// Notice that we don't need to set the role in the
// manager first if we don't care about inheritance.
$ manager -> role ( ' user ' )-> deny ( ' user ' , ' create ' , ' posts ' );
$ manager -> caller ( $ caller )-> can ( ' create ' , ' posts ' ); // true: the user has explicit permission to create posts.
الشروط هي في الواقع تأكيدات وهي عبارة عن عمليات فحص إضافية يمكنك تعيينها للحصول على الأذونات. يمكنك تمرير مصفوفة معهم كمعلمة أخيرة allow
deny
. يجب أن تطبق جميع الشروط واجهة BeatSwitchLockPermissionsCondition
.
تحذير: يرجى ملاحظة أن الظروف الحالية تعمل فقط مع برامج التشغيل الثابتة.
دعونا إعداد شرط.
<?php
use BeatSwitch Lock Lock ;
use BeatSwitch Lock Permissions Condition ;
use BeatSwitch Lock Permissions Permission ;
use BeatSwitch Lock Resources Resource ;
use Illuminate Auth AuthManager ;
class LoggedInCondition implements Condition
{
/**
* The Laravel AuthManager instance
*
* @var IlluminateAuthAuthManager
*/
protected $ auth ;
/**
* @param IlluminateAuthAuthManager $auth
*/
public function __construct ( AuthManager $ auth )
{
$ this -> auth = $ auth ;
}
/**
* Assert if the condition is correct
*
* @param BeatSwitchLockLock $lock The current Lock instance that's being used
* @param BeatSwitchLockPermissionsPermission $permission The Permission that's being checked
* @param string $action The action passed to the can or cannot method
* @param BeatSwitchLockResourcesResource|null $resource The resource passed to the can or cannot method
* @return bool
*/
public function assert ( Lock $ lock , Permission $ permission , $ action , Resource $ resource = null )
{
// Condition will succeed if the user is logged in.
return $ this -> auth -> check ();
}
}
الآن دعونا نرى كيف سيعمل هذا عند إعداد الإذن.
$ condition = App:: make ( ' LoggedInCondition ' );
$ lock -> allow ( ' create ' , ' posts ' , null , $ condition );
$ lock -> can ( ' create ' , ' posts ' ); // true if logged in, otherwise false.
يمكنك أيضًا تمرير شروط متعددة.
$ lock -> allow ( ' create ' , ' posts ' , null , [ $ falseCondition , $ trueCondition ]);
$ lock -> can ( ' create ' , ' posts ' ); // false: there's at least one false condition
يمكنك تمرير أي عدد تريده من الشروط ولكن يجب أن تنجح جميعها حتى يعمل الإذن.
يمكنك أيضًا استخدام رد الاتصال إذا أردت.
$ lock -> allow ( ' create ' , ' posts ' , null , function ( $ lock , $ permission , $ action , $ resource = null ) {
return false ;
});
$ lock -> can ( ' create ' , ' posts ' ); // false because the callback returns false.
إذا كنت ترغب في استرداد قائمة بالموارد المسموح بها أو المرفوضة لتنفيذ إجراء معين، فيمكنك استخدام الطرق allowed
denied
في مثيل Lock
.
$ lock -> allow ( ' update ' , ' users ' , 1 );
$ lock -> allow ( ' update ' , ' users ' , 2 );
$ lock -> allow ( ' update ' , ' users ' , 3 );
$ lock -> deny ( ' update ' , ' users ' , 2 );
$ lock -> allowed ( ' update ' , ' users ' ); // Returns [1, 3];
$ lock -> denied ( ' update ' , ' users ' ); // Returns [2];
برجاء الأخذ في الاعتبار أنه لا يمكنك استرداد المعرفات إلا من الموارد التي تم تعيين أذونات لها. لن يتم إرجاع الموارد التي لم يتم تسجيلها من خلال القفل.
يمكنك بسهولة إضافة وظيفة التحكم في الوصول إلى المتصل أو الدور الخاص بك عن طريق تطبيق سمة BeatSwitchLockLockAware
.
<?php
use BeatSwitch Lock Callers Caller ;
use BeatSwitch Lock LockAware ;
class Organization implements Caller
{
use LockAware;
public function getCallerType ()
{
return ' organizations ' ;
}
public function getCallerId ()
{
return $ this -> id ;
}
public function getCallerRoles ()
{
return [ ' enterprise ' ];
}
}
الآن نحن بحاجة إلى تعيين مثيل القفل الخاص به.
$ caller -> setLock ( $ lock );
والآن يستطيع المتصل بك استخدام جميع طرق القفل لنفسه.
$ caller -> can ( ' create ' , ' posts ' );
$ caller -> allow ( ' edit ' , ' pages ' );
إذا كان لديك متصل يقوم بتطبيق سمة LockAware
ولكنك لم تقم بتشغيل مثيل قفل المتصل، فيمكنك بسهولة جعل قفل المتصل على علم باستخدام طريقة makeCallerLockAware
الخاصة بالمدير.
$ caller = $ manager -> makeCallerLockAware ( $ caller );
والآن سيتمكن المتصل بك من استخدام طرق LockAware
. هناك طريقة مماثلة للأدوار.
$ role = $ manager -> makeRoleLockAware ( ' guest ' );
سيؤدي هذا إلى تمهيد كائن SimpleRole
الذي يأتي بالفعل مع خاصية LockAware
في مكانها.
يمكن استدعاء جميع الطرق التالية على مثيل BeatSwitchLockLock
.
يتحقق لمعرفة ما إذا كان المتصل الحالي لديه الإذن للقيام بشيء ما.
can(
string|array $action,
string|BeatSwitchLockResourcesResource $resource = null,
int $resourceId = null
)
يتحقق لمعرفة ما إذا كان ممنوعًا على المتصل الحالي أن يفعل شيئًا ما.
cannot(
string|array $action,
string|BeatSwitchLockResourcesResource $resource = null,
int $resourceId = null
)
تعيين إذن Privilege
للمتصل للسماح له بفعل شيء ما. يزيل أي قيود مطابقة.
allow(
string|array $action,
string|BeatSwitchLockResourcesResource $resource = null,
int $resourceId = null,
BeatSwitchLockPermissionsCondition[] $conditions = []
)
تعيين إذن Restriction
للمتصل لمنعه من القيام بشيء ما. يزيل أي امتيازات مطابقة.
deny(
string|array $action,
string|BeatSwitchLockResourcesResource $resource = null,
int $resourceId = null,
BeatSwitchLockPermissionsCondition[] $conditions = []
)
تبديل قيمة الإذن المعطى.
toggle(
string|array $action,
string|BeatSwitchLockResourcesResource $resource = null,
int $resourceId = null
)
إرجاع جميع المعرفات الموجودة في مصفوفة من نوع المورد المحدد الذي يُسمح للموضوع بتنفيذ الإجراء المحدد عليه.
allowed(
string|array $action,
string|BeatSwitchLockResourcesResource $resourceType
)
إرجاع جميع المعرفات الموجودة في مصفوفة من نوع المورد المحدد الذي تم رفض تنفيذ الإجراء المحدد عليه.
denied(
string|array $action,
string|BeatSwitchLockResourcesResource $resourceType
)
يمكن استدعاء جميع الطرق التالية على مثيل BeatSwitchLockManager
.
إرجاع مثيل BeatSwitchLockLock
للمتصل.
caller(
BeatSwitchLockCallersCaller $caller
)
إرجاع مثيل BeatSwitchLockLock
للدور.
role(
BeatSwitchLockRolesRole $role
)
أضف اسمًا مستعارًا لإجراء واحد أو أكثر.
alias(
string $name,
string|array $actions
)
قم بتعيين دور واحد أو أكثر ودور اختياري لترث الأذونات منه.
setRole(
string|array $name,
string $inherit = null
)
يضبط مثيل القفل للمتصل الذي يقوم بتنفيذ سمة LockAware
. إرجاع المتصل مع مجموعة مثيلات القفل.
makeCallerLockAware(
BeatSwitchLockCallersCaller $caller
)
يضبط مثيل القفل للدور الذي يطبق سمة LockAware
. إرجاع الدور مع مجموعة مثيلات القفل.
makeRoleLockAware(
BeatSwitchLockRolesRole|string $role
)
يمكنك بسهولة إنشاء برنامج تشغيل من خلال تنفيذ عقد BeatSwitchLockDriversDriver
. سنوضح أدناه كيفية إنشاء برنامج التشغيل المستمر الخاص بنا باستخدام Laravel's Eloquent ORM كآلية تخزين لدينا.
سنفترض أن لدينا فئة نموذج CallerPermission
تحتوي على الأقل على أعمدة قاعدة البيانات التالية:
caller_type
(فارتشار، 100)caller_id
(كثافة العمليات، 11)type
(فارشار، 10)action
(فارشار، 100)resource_type
(فارتشار، 100، لاغية)resource_id
(int، 11، nullable) ولدينا نموذج RolePermission
مع أعمدة قاعدة البيانات التالية:
role
(فارتشار، 100)type
(فارشار، 10)action
(فارشار، 100)resource_type
(فارتشار، 100، لاغية)resource_id
(int، 11، nullable) دعونا نتحقق من التنفيذ الكامل لبرنامج التشغيل أدناه. لاحظ أنه بالنسبة لطريقة getCallerPermissions
فإننا نستخدم فئة PermissionFactory
لتعيين البيانات بسهولة وإنشاء كائنات Permission
منها. سيقبل أسلوب createFromData
الخاص بـ PermissionFactory
كلاً من المصفوفات والكائنات.
<?php
use BeatSwitch Lock Callers Caller ;
use BeatSwitch Lock Drivers Driver ;
use BeatSwitch Lock Permissions Permission ;
use BeatSwitch Lock Permissions PermissionFactory ;
use BeatSwitch Lock Roles Role ;
use CallerPermission ;
use RolePermission ;
class EloquentDriver implements Driver
{
/**
* Returns all the permissions for a caller
*
* @param BeatSwitchLockCallersCaller $caller
* @return BeatSwitchLockPermissionsPermission[]
*/
public function getCallerPermissions ( Caller $ caller )
{
$ permissions = CallerPermission:: where ( ' caller_type ' , $ caller -> getCallerType ())
-> where ( ' caller_id ' , $ caller -> getCallerId ())
-> get ();
return PermissionFactory:: createFromData ( $ permissions -> toArray ());
}
/**
* Stores a new permission into the driver for a caller
*
* @param BeatSwitchLockCallersCaller $caller
* @param BeatSwitchLockPermissionsPermission
* @return void
*/
public function storeCallerPermission ( Caller $ caller , Permission $ permission )
{
$ eloquentPermission = new CallerPermission ;
$ eloquentPermission -> caller_type = $ caller -> getCallerType ();
$ eloquentPermission -> caller_id = $ caller -> getCallerId ();
$ eloquentPermission -> type = $ permission -> getType ();
$ eloquentPermission -> action = $ permission -> getAction ();
$ eloquentPermission -> resource_type = $ permission -> getResourceType ();
$ eloquentPermission -> resource_id = $ permission -> getResourceId ();
$ eloquentPermission -> save ();
}
/**
* Removes a permission from the driver for a caller
*
* @param BeatSwitchLockCallersCaller $caller
* @param BeatSwitchLockPermissionsPermission
* @return void
*/
public function removeCallerPermission ( Caller $ caller , Permission $ permission )
{
CallerPermission:: where ( ' caller_type ' , $ caller -> getCallerType ())
-> where ( ' caller_id ' , $ caller -> getCallerId ())
-> where ( ' type ' , $ permission -> getType ())
-> where ( ' action ' , $ permission -> getAction ())
-> where ( ' resource_type ' , $ permission -> getResourceType ())
-> where ( ' resource_id ' , $ permission -> getResourceId ())
-> delete ();
}
/**
* Checks if a permission is stored for a user
*
* @param BeatSwitchLockCallersCaller $caller
* @param BeatSwitchLockPermissionsPermission
* @return bool
*/
public function hasCallerPermission ( Caller $ caller , Permission $ permission )
{
return ( bool ) CallerPermission:: where ( ' caller_type ' , $ caller -> getCallerType ())
-> where ( ' caller_id ' , $ caller -> getCallerId ())
-> where ( ' type ' , $ permission -> getType ())
-> where ( ' action ' , $ permission -> getAction ())
-> where ( ' resource_type ' , $ permission -> getResourceType ())
-> where ( ' resource_id ' , $ permission -> getResourceId ())
-> first ();
}
/**
* Returns all the permissions for a role
*
* @param BeatSwitchLockRolesRole $role
* @return BeatSwitchLockPermissionsPermission[]
*/
public function getRolePermissions ( Role $ role )
{
$ permissions = RolePermission:: where ( ' role ' , $ role -> getRoleName ())-> get ();
return PermissionFactory:: createFromData ( $ permissions -> toArray ());
}
/**
* Stores a new permission for a role
*
* @param BeatSwitchLockRolesRole $role
* @param BeatSwitchLockPermissionsPermission
* @return void
*/
public function storeRolePermission ( Role $ role , Permission $ permission )
{
$ eloquentPermission = new RolePermission ;
$ eloquentPermission -> role = $ role -> getRoleName ();
$ eloquentPermission -> type = $ permission -> getType ();
$ eloquentPermission -> action = $ permission -> getAction ();
$ eloquentPermission -> resource_type = $ permission -> getResourceType ();
$ eloquentPermission -> resource_id = $ permission -> getResourceId ();
$ eloquentPermission -> save ();
}
/**
* Removes a permission for a role
*
* @param BeatSwitchLockRolesRole $role
* @param BeatSwitchLockPermissionsPermission
* @return void
*/
public function removeRolePermission ( Role $ role , Permission $ permission )
{
RolePermission:: where ( ' role ' , $ role -> getRoleName ())
-> where ( ' type ' , $ permission -> getType ())
-> where ( ' action ' , $ permission -> getAction ())
-> where ( ' resource_type ' , $ permission -> getResourceType ())
-> where ( ' resource_id ' , $ permission -> getResourceId ())
-> delete ();
}
/**
* Checks if a permission is stored for a role
*
* @param BeatSwitchLockRolesRole $role
* @param BeatSwitchLockPermissionsPermission
* @return bool
*/
public function hasRolePermission ( Role $ role , Permission $ permission )
{
return ( bool ) RolePermission:: where ( ' role ' , $ role -> getRoleName ())
-> where ( ' type ' , $ permission -> getType ())
-> where ( ' action ' , $ permission -> getAction ())
-> where ( ' resource_type ' , $ permission -> getResourceType ())
-> where ( ' resource_id ' , $ permission -> getResourceId ())
-> first ();
}
}
لاحظ أننا لا نتحقق مما إذا كان الإذن موجودًا بالفعل عندما نحاول تخزينه. لا داعي للقلق بشأن ذلك لأنه تم تنفيذ كل ذلك من أجلك في مثيل Lock
.
الآن لدينا برنامج تشغيل يدعم تخزين أذونات المتصلين والأدوار.
من السهل جدًا عليك التأكد من أن برنامج التشغيل الخاص بك يعمل كما هو متوقع. إذا كنت تقوم بإنشاء برنامج تشغيل دائم، فيمكنك اختباره بسهولة عن طريق إنشاء اختبار PHPUnit الذي يمتد إلى فئة PersistentDriverTestCase
.
<?php
use BeatSwitch Lock Tests PersistentDriverTestCase ;
class EloquentDriverTest extends PersistentDriverTestCase
{
public function setUp ()
{
// Don't forget to reset your DB here.
// Bootstrap your driver.
$ this -> driver = new EloquentDriver ();
parent :: setUp ();
}
}
وهذا هو كل ما تحتاجه! يحتوي PersistentDriverTestCase
على جميع الاختبارات التي ستحتاج إليها للتأكد من أن برنامج التشغيل الخاص بك يعمل كما هو متوقع. لذا، إذا نجحت كل هذه الاختبارات، فهذا يعني أنه تم إعداد برنامج التشغيل الخاص بك بشكل صحيح. لا داعي للسخرية من أي شيء، فهذه حالة اختبار تكامل خالص. بالطبع في هذا المثال المحدد أعلاه، لكي يعمل Eloquent، ستحتاج إلى تشغيل Laravel. سيكون العمل مع قاعدة بيانات مثل sqlite هو أفضل طريقة هنا لاختبار برنامج التشغيل الخاص بك.
القفل غير قابل للصيانة في هذه اللحظة.
تتم صيانة هذه الحزمة حاليًا بواسطة Dries Vints.
إذا كانت لديك أي أسئلة فلا تتردد في طرحها في أي مشكلة.
يرجى الاطلاع على الملف المساهمة للحصول على التفاصيل.
يمكنك الاطلاع على قائمة التغييرات لكل إصدار في ملف سجل التغيير الخاص بنا.
رخصة معهد ماساتشوستس للتكنولوجيا. يرجى الاطلاع على ملف الترخيص لمزيد من المعلومات.