Thinkphp Rbac 一

rbac指的是基于角色的访问控制,就是通过权限表与用户组进行关联以达到权限认证的目的,thinkphp rbac是它对rbac的一个封装,可以不需要写过多的代码完成这个功能。

Thinkphp Rbac的认证原理是这样的:

1.判断当前模块的当前操作是否需要认证,如果需要认证未登录就跳转到认证网关获取决策访问列表,如果不需要认证未登录就检测是否有访问权限。

我们可以从Tp的源码中观察到,它是通过saveAccessList获取用户的权限列表,并保存到session中。

 //用于检测用户权限的方法,并保存到Session中
    static function saveAccessList($authId=null) {
        if(null===$authId)   $authId = $_SESSION[C('USER_AUTH_KEY')];
        // 如果使用普通权限模式,保存当前用户的访问权限列表
        // 对管理员开发所有权限
        if(C('USER_AUTH_TYPE') !=2 && !$_SESSION[C('ADMIN_AUTH_KEY')] )
            $_SESSION['_ACCESS_LIST']   =   self::getAccessList($authId);
        return ;
    }

首先定义了一个静态方法, 然后判断session中是否存在标记名,如果获取到了,就继续判断认证类型,并且没有在配置中发现管理认证标记,就通过getAccessList获取,最后使用return返回获取的信息。格式类似这样的。

$_SESSION['APPNAME']['MOUDULENAME']['ACTIONNAME'];

如果信息存在, 就说明该项目的该模块具有该操作的权限,比如

http://localhost/admin.php/home/index/addnews

就说明, 后台管理项目的index模块具有addnews操作的权限。

当把rbac所需的配置完成以后,判断就不需要自己来进行了,可以看到,tp下提供了一个方法可以用来判断

 //权限认证的过滤器方法
    static public function AccessDecision($appName=MODULE_NAME) {
        //检查是否需要认证
        if(self::checkAccess()) {
            //存在认证识别号,则进行进一步的访问决策
            $accessGuid   =   md5($appName.CONTROLLER_NAME.ACTION_NAME);
            if(empty($_SESSION[C('ADMIN_AUTH_KEY')])) {
                if(C('USER_AUTH_TYPE')==2) {
                    //加强验证和即时验证模式 更加安全 后台权限修改可以即时生效
                    //通过数据库进行访问检查
                    $accessList = self::getAccessList($_SESSION[C('USER_AUTH_KEY')]);
                }else {
                    // 如果是管理员或者当前操作已经认证过,无需再次认证
                    if( $_SESSION[$accessGuid]) {
                        return true;
                    }
                    //登录验证模式,比较登录后保存的权限访问列表
                    $accessList = $_SESSION['_ACCESS_LIST'];
                }
                //判断是否为组件化模式,如果是,验证其全模块名
                if(!isset($accessList[strtoupper($appName)][strtoupper(CONTROLLER_NAME)][strtoupper(ACTION_NAME)])) {
                    $_SESSION[$accessGuid]  =   false;
                    return false;
                }
                else {
                    $_SESSION[$accessGuid]  =   true;
                }
            }else{
                //管理员无需认证
                return true;
            }
        }
        return true;
    }

当一切准备妥当以后, 直接在php业务代码文件里进行判断即可,下面会有实例。

此条目发表在php分类目录,贴了, , , 标签。将固定链接加入收藏夹。

发表评论

电子邮件地址不会被公开。 必填项已用*标注