使用中间件保护路由
ACL 确定控制器是否有资源方法 (index, create, store, 等) ,或者是 RESTful。
如果方法名不是资源(即非 index, create, store),则会检查 RESTful (HTTP 方法 GET, POST, PUT, DELETE)。
如果你的项目中这些都不可用,则必须定义包含方法的数组类型的 protect_methods
参数,这些方法是需要在 crud 中被保护的。
例如,用户查看内容时是一个 GET 请求,所以 ACL 会检查它是否是资源方法,如果不是则检查 restful 并得知它是 GET 方法,则 view
被保护,因此用户必须要有 view.user
权限。
如果你传入 protect_methods
,可以通过定义你自己的方法名来保护资源。
[
'create' => ['store'], // protects store() method on create.user (create.alias)
'view' => ['index', 'create', 'show', 'edit'], // protects index(), create(), show(), edit() methods on view.user permission.
'update' => ['update'],
'delete' => ['destroy']
]
参数定义
- 验证用户是否拥有角色,
['is' => 'administrator']
- 验证用户是否拥有权限,
['can' => 'view.admin, update.user']
- 保护控制器方法,
['protect_alias' => 'user']
,会使用权限的别名user
并基于这个别名的权限保护 crud 方法。
举个栗子,如果用户有查看的权限但没有更新的权限,则允许 HTTP GET 方法但不允许 PUT。
如果你需要保护自己的控制器方法,你可以将它们定义为一个数组。
['protect_alias' => 'user',
'protect_methods' => [
'create' => ['someMethod', 'anotherMethod'],
'read' => ['readMethod', 'showMethod'],
'view' => ['readMethod', 'showMethod'], // its same as read.
'update' => ['editMethod'],
'delete' => ['destroyMethod']
]];
保护路由组/资源
要保护路由很容易。下面的例子检查用户是否有 administrator
角色。
Route::group(['prefix' => 'user',
'middleware' => ['auth', 'acl'],
'is' => 'administrator'],
function () {
Route::resource('user', 'UsersController');
});
或者检查用户是否有 administrator
角色并有 create.user, delete.user
的权限。
Route::group(['prefix' => 'user',
'middleware' => ['auth', 'acl'],
'is' => 'administrator',
'can' => 'create.user, delete.user'],
function () {
Route::resource('user', 'UsersController');
});
或者通过 user
权限别名保护 crud 方法。
Route::group(['prefix' => 'user',
'middleware' => ['auth', 'acl'],
'is' => 'administrator',
'can' => 'do.something',
'protect_alias' => 'user'],
function () {
Route::resource('user', 'UsersController');
});
保护路由
保护一个单独的路由和保护路由组的设置一样简单。只需要使用相同的权限参数。
Route::get('/dashboard', [
'uses' => 'DashboardController@index',
'middleware' => ['auth', 'acl'],
'is' => 'administrator',
'can' => 'view.dashboard']);
或者通过 dashboard
权限别名保护 crud 方法。
Route::get('/dashboard', [
'uses' => 'DashboardController@index',
'middleware' => ['auth', 'acl'],
'is' => 'administrator',
'protect_alias' => 'dashboard']);