barryvdh/laravel-security

此包已被弃用且不再维护。没有建议的替代包。
此包的最新版本(v0.1.0)没有可用的许可信息。

此包在Laravel中集成了Symfony Security Core,主要用于使用投票者来检查对角色/对象的访问。

v0.1.0 2014-06-13 08:29 UTC

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_AUTHENTICATEDAUTH
  • RoleHierarchyVoter:检查用户是否有角色,使用配置中的层次结构。(ROLE_ADMINROLE_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'));