barryvdh / laravel-security
此包在Laravel中集成了Symfony Security Core,主要用于使用投票者来检查对角色/对象的访问。
Requires
- php: >=5.3.0
- illuminate/support: 4.x
- symfony/security-core: *
This package is auto-updated.
Last update: 2024-03-09 19:18:01 UTC
README
版本0.2.x@dev适用于Laravel 5。使用0.1.x适用于Laravel 4!
此包在Laravel中集成了Symfony Security Core,主要用于使用投票者来检查对角色/对象的访问。请参阅Symfony 授权
安装
将此包添加到composer.json,并运行composer update
"barryvdh/laravel-security": "0.2.x@dev"
更新后,将ServiceProvider添加到config/app.php中的ServiceProvider数组
'Barryvdh\Security\SecurityServiceProvider'
您可以可选地添加Facade,以提供对Security组件的更快访问。
'Security' => 'Barryvdh\Security\Facade',
配置
您可以通过发布配置来更改策略并添加自己的角色层次结构,以配置哪些角色相互继承。
$ php artisan vendor:publish config
//config/security.php
'role_hierarchy' => array(
'ROLE_ADMIN' => array('ROLE_USER'),
'ROLE_SUPER_ADMIN' => array('ROLE_ADMIN', 'ROLE_ALLOWED_TO_SWITCH')
)
投票者
默认情况下,只包含2个投票者
- AuthVoter,检查用户是否已认证(
IS_AUTHENTICATED
或AUTH
) - RoleHierarchyVoter:检查用户是否有角色,使用配置中的层次结构。(
ROLE_ADMIN
,ROLE_EDITOR
等)
要使用角色,请向您的User模型添加一个getRoles()函数,该函数返回一个包含角色字符串的数组(注意:角色必须以ROLE_开头)
public function roles(){
return $this->belongsToMany('Role');
}
public function getRoles(){
return $this->roles()->lists('name');
}
您可以通过将它们添加到配置中来添加投票者。
'voters' => [
...
'App\Security\MyVoter.php',
],
您还可以通过扩展$app['security.voters']或使用facade来添加投票者
Security::addVoter(new MyVoter());
投票者必须实现VoterInterface。您可以定义投票者可以处理的哪些属性(例如,ROLE_ADMIN,IS_AUTHENTICATED,EDIT等)和哪些对象。投票者将根据策略对属性(和可能的对象)进行投票,允许、拒绝或放弃访问。根据策略,最终决策基于投票。(默认情况下,1个允许就足够了)
您可以使用$token->getUser()访问User对象。有关示例,请参阅Symfony 关于投票者的食谱
检查访问
您可以使用IoC容器、facade和辅助函数来检查访问权限
App::make('security.authorization_checker')->isGranted('ROLE_ADMIN');
Security::isGranted('edit', $post);
is_granted('AUTH');
第一个参数是要检查的属性,第二个参数是可选的对象,您想要检查其访问权限。例如,您可以编写一个投票者来检查当前用户是否可以编辑评论,基于他对该对象的拥有权或其角色。
过滤器
您可以在Laravel的路由过滤器中使用此功能,包括路由和控制器。
Route::get('admin', array('before' => 'is_granted:ROLE_ADMIN', function(){..}));
Route::filter('is_granted', function($route, $request, $attribute, $parameter=null){
if (!is_granted($attribute, $route->getParameter($parameter)))
return Redirect::route('login');
});
如果您设置了模型绑定,您可以轻松访问对象。
Route::model('company', 'Company');
Route::get('companies/{company}', array('uses'=> 'CompanyController@getView', 'before' => 'is_granted:view,company'));