安装

composer require spatie/laravel-permission

  github上有详细介绍:https://github.com/spatie/laravel-permission

我先来说一下核心的判断是否授权,

$user = AdminUser::find($adminId);
$user->hasPermissionTo($name, 'admin')

$user为默认的User的Model对应find后实例,$name为当前的路由,可以用以下3种方式获取

$router->currentRouteName();
$request->path();
$request->route()[1]['uri'];

前两种比较常见,第三种是获取当前访问路由的$name值,像/xxx/{id}之类的,感觉比较实用,具体可以看下 http://www.cnblogs.com/cxscode/p/8435405.html

接下来讲讲Permission自动生成的5张表,roles角色表, role_has_permissions角色关联权限表, permissions权限表, model_has_roles用户关联角色表, model_has_permission用户关联权限表

roles表

比较重要两个字段name和guard_name,name是角色名,guard_name是应该算是权限的域,和中间件有关系,其层高于整个rbac(权限),这个值一般是admin,可能这个管理员还有前台的权限,那可能这部分权限的guard_name就会是web之类的词了,

permissions表

比较重要两个字段name和guard_name,name存的是当前权限访问的路由,当然也可以是其他,一般是用路由,guard_name同roles表

model_has_roles表 和 model_has_permission表

这两个表的model_id就是对应用户表的id了

以下摘自Laravel-Permission 使用心得:http://blog.csdn.net/complicated19921001/article/details/78317969

1.执行完github上的命令,你的数据库有 
roles role_has_permissions permissions model_has_roles model_has_permission

2.在你的项目里 你不需要为role permission建立model,,你只需要userModel

3.在userModel里加上

use Illuminate\Foundation\Auth\User as Authenticatable;
use Spatie\Permission\Traits\HasRoles; class UserModel extends Authenticatable
{
use HasRoles;
protected $guard_name = 'web';
//your code
}

  

new一个UserModel对象,这些方法都可以使用了, 
1. user−>assignRole(‘writer′);

2.user->removeRole(‘writer’);

3. user−>syncRoles(params);(这个方法我个人比较喜欢,当我们改变一个user的角色时候,用它最好不过了,它会把本来有的角色给你取消,然后赋予新的角色,这样特别省事,还能一次赋予好几个角色

4.role->givePermissionTo(‘edit articles’);

5. role−>revokePermissionTo(‘editarticles′);6.role->syncPermissions(params);

个人使用心得

PS:强烈建议在 UserModel 里面添加上 guard_name 字段,并赋予值。在创建新role时候,也手动指定 guard_name的值,原因有二: 
1.这个值会一并插入到表里 guard_name 字段,该字段默认不能为null 
2.这个是区分role的字段, 
eg: post-manager web; 
post-manager admin; 
这两个roleName一样,但是guard_name不一样,这也是两个角色; 
说的通俗一点,guard_name这个值有点“分组”的概念。

在创建新role的时候,guard_name如果没有,那就取auth.defaults.guard的值,这个laravel默认是“web”,这是源码

public static function create(array $attributes = [])
{
$attributes['guard_name'] = $attributes['guard_name'] ?? config('auth.defaults.guard'); if (static::where('name', $attributes['name'])->where('guard_name', $attributes['guard_name'])->first()) {
throw RoleAlreadyExists::create($attributes['name'], $attributes['guard_name']);
} if (app()::VERSION < '5.4') {
return parent::create($attributes);
} return static::query()->create($attributes);
}

  

使用 assignRole() syncRoles(); getRoleNames()这些方法的时候,回去根据$guard_name值去判断角色是否存在,如果你没有在UserModel里面指明,它会去取config\auth.php的 guards的值,这是源码

protected function getGuardNames(): Collection
{
if ($this->guard_name) {
return collect($this->guard_name);
} return collect(config('auth.guards'))
->map(function ($guard) {
return config("auth.providers.{$guard['provider']}.model");
})
->filter(function ($model) {
return get_class($this) === $model;
})
->keys();
}

  

可以看出 如果你的类里定义了 guard_name 那就直接取出,否则去取config\auth.php 的 guards里的一个model对应的key值作为guard_name,根据这个值去判断角色的存不存在。

我在使用的时候就遇到一个问题,数据里角色明明有,但是一执行assignRole(‘post-manager’)就报 “找不到角色”的错误。后来看了源码才知道是这样: 
我的guards是自己添加,我自己在config\auth.php里的guards数组里添加

‘admin’=>[
‘driver’ => ‘session’,
‘provider’ => ‘admins’,
],

  

也就是说在assignRole() getRoleNames()的时候,guard_name的值是 ‘admin’

这就是问题的所在,创建的时候默认的是web(auth.defaults.guard),但是查询role的时候是admin(guards里的一个model对应的key值),所以会说“找不到角色这个问题” 
所以,再次强调一下,

1.创建新role的时候,guard_name手动添加到数组里面 
2.在UserModel里定义了protected= $guard_name,并赋予和上一步一样的值(这样它就不会再去config\auth.php里的guards数组去取值了,就不会出现guard_name不一致的情况)

我个人比较喜欢的是 user->role->permission的方式,user只拥有role,而role只拥有permission 这样user的权限完全取决于它的角色,user不会直接跟permission打交道 
而Laravel-Permission 是可以直接给user赋予permission(model_has_permissions表就是干这个的)。如果按我比较喜欢的风格,这个表就用不到了 。

lumen-Permission 权限管理使用心得的更多相关文章

  1. Android权限管理之Permission权限机制及使用

    前言: 最近突然喜欢上一句诗:"宠辱不惊,看庭前花开花落:去留无意,望天空云卷云舒." 哈哈~,这个和今天的主题无关,最近只要不学习总觉得生活中少了点什么,所以想着围绕着最近面试过 ...

  2. 我的MYSQL学习心得(十三) 权限管理

    我的MYSQL学习心得(十三) 权限管理 我的MYSQL学习心得(一) 简单语法 我的MYSQL学习心得(二) 数据类型宽度 我的MYSQL学习心得(三) 查看字段长度 我的MYSQL学习心得(四) ...

  3. mvc5+ef6+Bootstrap 项目心得--身份验证和权限管理

    1.mvc5+ef6+Bootstrap 项目心得--创立之初 2.mvc5+ef6+Bootstrap 项目心得--身份验证和权限管理 3.mvc5+ef6+Bootstrap 项目心得--WebG ...

  4. 我的MYSQL学习心得 mysql的权限管理

    这一篇<我的MYSQL学习心得(十三)>将会讲解MYSQL的用户管理 在mysql数据库中,有mysql_install_db脚本初始化权限表,存储权限的表有: 1.user表 2.db表 ...

  5. [转]mvc5+ef6+Bootstrap 项目心得--身份验证和权限管理

    本文转自:http://www.cnblogs.com/shootingstar/p/5629668.html 1.mvc5+ef6+Bootstrap 项目心得--创立之初 2.mvc5+ef6+B ...

  6. 一步一步Asp.Net MVC系列_权限管理总结(附MVC权限管理系统源码)

    在上一节中我们总结了关于权限控制的方式,我们这一节讲解关于权限控制中角色权限的授予处理等等并做本系列的总结. 首先,我们来谈谈权限控制中角色权限的控制,上一节只是针对权限拦截中比较粗的控制,如果我们需 ...

  7. NopCommerce源代码分析之用户验证和权限管理

    目录 1.  介绍 2.  UML 2.1  实体类UML图 2.2  业务相关UML图 3.  核心代码分析 3.1  实体类源代码 3.2  业务相关源代码 3.3  相关控制器源代码 3.4  ...

  8. Android权限管理之RxPermission解决Android 6.0 适配问题

    前言: 上篇重点学习了Android 6.0的运行时权限,今天还是围绕着Android 6.0权限适配来总结学习,这里主要介绍一下我们公司解决Android 6.0权限适配的方案:RxJava+RxP ...

  9. Android权限管理之Android 6.0运行时权限及解决办法

    前言: 今天还是围绕着最近面试的一个热门话题Android 6.0权限适配来总结学习,其实Android 6.0权限适配我们公司是在今年5月份才开始做,算是比较晚的吧,不过现在Android 6.0以 ...

随机推荐

  1. java获取src下包的文件的路径

    String params = getClass().getClassLoader().getResource("system-config.properties").getPat ...

  2. Kafka server.properties配置,集群部署

    server.properties中所有配置参数说明(解释) broker.id =0每一个broker在集群中的唯一表示,要求是正数.当该服务器的IP地址发生改变时,broker.id没有变化,则不 ...

  3. Spark(九) -- SparkSQL API编程

    本文测试的Spark版本是1.3.1 Text文本文件测试 一个简单的person.txt文件内容为: JChubby,13 Looky,14 LL,15 分别是Name和Age 在Idea中新建Ob ...

  4. windowsclient开发--依据可下载url另存为文件(微信windowsclient这样做的)

    能够我的blog的标题会让你误解,那么好,没图说了xx: 比方微信windowsclient发送了一张图片,我们能够预览这张图片,还能够保存到本地: 那么windows程序是怎样下载这张图片的呢? 是 ...

  5. 关于部分Android手机安装apk,无法获取正常的logo

    最近出现过类似的问题,主要出现是在,MediaPad X1 7.0和MediaPad M1 8.0. 发布应用的时候明明配置好了图标的,但是始终找不到原因,郁闷了好几个小时,也浪费了好几个小时. 如果 ...

  6. oracle新建一个表空间和用户来測试

    首先对表空间作例如以下说明 暂时表空间:是在做大数据量排序时.分组操作时用的.正常这些都是在内存中完毕的.但在大数据量排序处理时.内存不够用的情况下就会用到暂时表空间,这里是不存放表的,有点类似于操作 ...

  7. SQL优化- 数据库SQL优化——使用EXIST代替IN

    数据库SQL优化——使用EXIST代替IN 1,查询进行优化,应尽量避免全表扫描 对查询进行优化,应尽量避免全表扫描,首先应考虑在 where 及 order by 涉及的列上建立索引 . 尝试下面的 ...

  8. ros下基于百度语音的,语音识别和语音合成

    代码地址如下:http://www.demodashi.com/demo/13153.html 概述: 本demo是ros下基于百度语音的,语音识别和语音合成,能够实现文字转语音,语音转文字的功能. ...

  9. Problem-1000:A + B Problem

    Problem-1000:A + B Problem Sample Code: C 代码: [code] #include int main() { int a,b; while(~scanf(&qu ...

  10. 剑指Offer-正则表达式匹配(Python)

    1 题干内容 请实现一个函数用来匹配包括.和*的正则表达式.模式中的字符.表示任意一个字符,而*表示它前面的字符可以出现任意次(包含0次). 在本题中,匹配是指字符串的所有字符匹配整个模式. 例如,字 ...