不基于任何模型使用 Laravel 5.1 的授权功能

Laravel 5.1.11 引入了一个新特性 —— 授权机制,该特性被设计为定义一系列与模型相关联的策略来实现授权。但有时候我们想要定义一个检测更高级别权限的策略,在该场景下不基于任何模型(比如文章更新权限基于Post模型)。下面这段代码即可实现该需求:

1、创建策略类

class AdminPolicy
{
    public function managePages($user)
    {
        return $user->hasRole(['Administrator', 'Content Editor']);
    }
}

2、在AuthServiceProvider中定义权限

/**
* 注册认证 / 授权服务.
*
* @param \Illuminate\Contracts\Auth\Access\Gate $gate
* @return void
*/
public function boot(GateContract $gate)
{
    foreach (get_class_methods(new \App\Policies\AdminPolicy) as $method) {
        $gate->define($method, "App\Policies\AdminPolicy@{$method}");
    }

    $this->registerPolicies($gate);
}

3、 使用(控制器/Blade/Eloquent)

$this->authorize('managePages'); // 在控制器中使用
@can('managePages') // 在Blade视图中使用
$user->can('managePages'); // 通过Eloquent使用

学院君 has written 617 articles

资深PHP工程师,Laravel学院院长

2 thoughts on “不基于任何模型使用 Laravel 5.1 的授权功能

  1. 此人已死 says:

    基于auth验证 数据库有两种设计模式 一种是传统的5表模式 user ,role_user,roles,permissions,permission_role还有一种只需要3个表user,roles,permissions就可以了,关联方式稍微有一些不同,不过后者要容易理解一些

发表评论

标记为*的字段是必填项(邮箱地址不会被公开)

你可以使用这些HTML 标签和属性: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>