Laravel5.1权限管理,比sentry/sentinel/entry更简单更快,核心代码不超过10行,请大神们发表点意见

最近研究Laravel的用户登录和权限,把结果和大家分享一下:
Laravel登陆和权限管理主要有用内置的+自己写,还有用

至于用包的好处是:功能强大、稍复杂、占用资源多,对包的依赖性强(比如sentry/sentinel/entry官方今天都还没有支持Laravel5.1)。

本来我是比较倾向于Laravel5.1+sentinel,因为sentinel除了权限管理,还能防暴力破解(连续多次登录失败后将不允许登录),但是要比如登陆、注册、找回密码等操作都要自己写控制器和视图,而且最讨厌的是我一直没有搞成功,可能是官方不支持5.1的原因,最后不得不放弃。

登陆、注册、找回密码,Laravel5.0的Auth自带了控制器和视图, Laravel5.1自带了控制器,视图可以直接复制5.0的,真的是非常方便,比包方便多了。
最后我用的方法是:用5.1自带的Auth,加个验证码(mews/captcha),权限管理自己写,具体思路为
config/app.php 增加下2个:
'qx_name' => [1=>'可登陆',2=>'可进后台',4=>'新闻编辑',8=>'增加新闻',16=>'删除新闻',32=>'系统设置',64=>'用户管理'],//权限名称
'qx' => [1=>['超级管理员',127],2=>['管理员',31],4=>['用户',1]],//所有用户组,可增加、修改、删除,如果可以让用户可以修改的话也很容易,不要放到app.php换个地方就可以了

写一个函数:
function lq_qx ($qx, $user_qx_group) {//验证$user_qx是否具有$qx的权限。$user_qx_group 用户表中的数字, $qx 具体某一个权限
    $qx_me = false;
    foreach (config('app.qx') as $k1=>$v1){//从config/app.php取得值
        if( ($user_qx_group & $k1) == $k1 ){
            if( (config('app.qx.'.$k1.'.1') & $qx) == $qx ){
                $qx_me = true;
            }
        }
    }
return $qx_me;
}

核心工作就完成了,如果要控制权限,在控制器加一句话即可,例如:
public function conf()
{
if( ! lq_qx (2, Auth::user()->permission))  return back()->with('message', '无权限!');
……
}

完成,此方法不用很多数据库,只要用户表有个permission字段(smallint)即可,而且代码少。

不知道这个方法有没有改进的空间,请大神们指点一下。

10 个评论

Mr_Old

Mr_Old

呵呵,你这个怎么实现用户组管理和权限管理?难道要手动改配置文件?如果要验证某个权限难道要翻开看看,然后记住这个权限在数组里的下标?除了众所周知的位运算,这个没有任何价值,原谅我说话这么直接
2015-06-26 23:23
wengcd

wengcd

3个关键词:中间件、ACL、Role
2015-06-26 23:38
琳琳

琳琳 回复 Mr_Old

配置文件就两个数组,其中qx_name是固定不变的,网站的使用者不用改这个。
网站使用者只要修改qx这个数组来达到新增、编辑、删除用户组的目的。
请看我的部分代码:
用户编辑的部分视图:
<label><input type="checkbox" name="permission[]" value="1">超级管理员</label>
<label><input type="checkbox" name="permission[]" value="2">管理员</label>
<label><input type="checkbox" name="permission[]" value="4">用户</label>
用户组编辑的部分视图
<label><input type="checkbox" name="group_qx[]" value="1">可登陆</label>
<label><input type="checkbox" name="group_qx[]" value="2">可进后台</label>
<label><input type="checkbox" name="group_qx[]" value="4">新闻编辑</label>
<label><input type="checkbox" name="group_qx[]" value="8">增加新闻</label>
<label><input type="checkbox" name="group_qx[]" value="16">删除新闻</label>
利用PHP生成 'qx' => [1=>['超级管理员',127],2=>['管理员',31],4=>['用户',1]] 你肯定会的吧?
这个数组不一定放在config/app.php,你可以生成数组后放到 config/XXX.php
2015-06-26 23:43
Mr_Old

Mr_Old 回复 琳琳

Role ---> (多对多) ---> Permission 。
User ---> (多对多) ---> Role 。
判断一个用户是否拥有某个权限,只需关联获取该用户的权限数组,in_array() 判断一下就好了。
2015-06-26 23:55
琳琳

琳琳 回复 Mr_Old

你没有明白我的思路,无法继续讨论下去
2015-06-27 08:51
Alano

Alano

支持妹子来啦
2015-06-27 13:55
道

插件很多啊zizaco/entrust
2015-06-27 16:02
琳琳

琳琳 回复 Alano

呵呵,谢谢支持!
2015-06-28 15:24
琳琳

琳琳

可能是我写得太乱了不容易看懂,我在此向大神们致歉了,回头有时间我重新组织一下文笔。
2015-06-28 15:26
Yzero

Yzero

期待。。。有空探讨下,只是我觉得你有种虽然简单看似复杂了,像sentry写的复杂用起来简单,大概这个意思!
2015-09-17 23:48

要回复文章请先登录注册