一、什么是RBAC

基于角色的访问控制(Role-Based Access Control)作为传统访问控制(自主访问,强制访问)的有前景的代替受到广泛的关注。

在RBAC中,权限与角色相关联,用户通过成为适当角色的成员而得到这些角色的权限。这就极大地简化了权限的管理。

在一个组织中,角色是为了完成各种工作而创造,用户则依据它的责任和资格来被指派相应的角色,用户可以很容易地从一个角色被指派到另一个角色。角色可依新的需求和系统的合并而赋予新的权限,而权限也可根据需要而从某角色中回收。角色与角色的关系可以建立起来以囊括更广泛的客观情况。

二、ThinkPHP中的RBAC

先看下官方给的实例所用到的数据表,通过5张表实现权限控制,定义如下:

RBAC 要用到5个数据表

think_user (用户表)

think_role (用户分组表)

think_node (操作节点)

think_role_user (用户和用户分组的对应)

think_access (各个操作和用户组的对应)

用户表

角色表,有哪些角色,该角色与对应的userid用户相关联

根据用户表的id给出对应的角色id相关联,也就是给用户分配角色,比如userid为3的角色为2,根据role角色表,7代表员工的角色

access表,权限表,比如角色id为2,也就是员工的权限,可以的对应的结点

结点表,代表有哪些应用-模块-模块方法,并且定义了之间的一种关系,比如noteid为30的是Public模块,noteid为31,32,33,34的方法add,insert,edit,update都属于Public。noteid为85的test方法,属于noteid为84的Game模块下的方法。

三、config配置文件详解

我们看看thinkphp官方示例中的config文件:

array(
'APP_AUTOLOAD_PATH'=>'@.TagLib',
'SESSION_AUTO_START'=>true,
'USER_AUTH_ON' =>true,
'USER_AUTH_TYPE' =>1, // 默认认证类型 1 登录认证 2 实时认证
'USER_AUTH_KEY' =>'authId', // 用户认证SESSION标记
'ADMIN_AUTH_KEY' =>'administrator',
'USER_AUTH_MODEL' =>'User', // 默认验证数据表模型
'AUTH_PWD_ENCODER' =>'md5', // 用户认证密码加密方式
'USER_AUTH_GATEWAY' =>'/Public/login',// 默认认证网关
'NOT_AUTH_MODULE' =>'Public', // 默认无需认证模块
'REQUIRE_AUTH_MODULE' =>'', // 默认需要认证模块
'NOT_AUTH_ACTION' =>'', // 默认无需认证操作
'REQUIRE_AUTH_ACTION' =>'', // 默认需要认证操作
'GUEST_AUTH_ON' =>false, // 是否开启游客授权访问
'GUEST_AUTH_ID' =>0, // 游客的用户ID
'DB_LIKE_FIELDS' =>'title|remark',
'RBAC_ROLE_TABLE' =>'think_role',
'RBAC_USER_TABLE' =>'think_role_user',
'RBAC_ACCESS_TABLE' =>'think_access',
'RBAC_NODE_TABLE' =>'think_node',
'SHOW_PAGE_TRACE'=>1//显示调试信息
);

大家看注释就应该懂大半了,其中Public模块是无需认证的,道理很简单,没登录之前大家都是游客身份,如果登录页面也要权限,那从哪里登录呢?是吧,呵呵。默认网关地址就是认证失败,没有权限跳转到此处,重新登陆。ADMIN_AUTH_KEY表示超级管理员权限,如果你在user表建立一个名为admin的用户,那么这个用户就是超级管理员,不用给它分配权限,什么权限都有,为什么要设置一个这样的管理员,因为当你把权限分配错了容易引起系统权限混乱,搞得大家都访问不了,这时候超级管理员就来了。

四、RBAC类的几个重要的方法

authenticate($map,$model=”)方法 传入查询用户的条件和用户表的MODEL 返回数组包含用户的信息

saveAccessList($authId=null)方法 传入用户的ID 此方法不返回值,只是设置 $_SESSION['_ACCESS_LIST']的值,其中包含了所有该用户对应的用户组的有权限操作的所有节点 $_SESSION['_ACCESS_LIST']['项目名']['模块名']['操作名'],以后判断权限就是判断当前项目,模块和操作是否在 $_SESSION['_ACCESS_LIST']中能找到。s

checkAccess() 方法 检测当前模块和操作是否需要验证 返回bool类型

checkLogin()方法 检测登录

AccessDecision($appName=APP_NAME) 方法 就是检测当前项目模块操作 是否在$_SESSION['_ACCESS_LIST']数组中,也就是说 在 $_SESSION['_ACCESS_LIST'] 数组中$_SESSION['_ACCESS_LIST']['当前操作']['当前模块']['当前操作']是否存在。如果存在表示有权限 否则返回flase。

getAccessList($authId) 方法 通过查询数据库 返回权限列表 $_SESSION['_ACCESS_LIST']的值了。

RBAC相关的配置的更多相关文章

  1. Zend_Frameowrk中进行多语言国际化的相关的配置和使用

    在使用Zend_Framework建立网站,若网站在以后的使用中面向国际,这时就需要实现网站的多语言国际化问题.使用Zend_Framework开发的网站需要进行多语言的开发时,就需要用到了Zend_ ...

  2. IIS性能相关的配置、命令

    IIS性能相关的配置.命令 应用程序池回收 不要使用缺省的“固定时间间隔(分钟)”:1740(即29小时),建议改为0 可以根据实际情况设置特定时间回收,比如凌晨4点 最大工作进程数 可以根据实际情况 ...

  3. Elasticsearch——集群相关的配置

    cluster模块主要用于控制分片在节点上如何进行分配,以及何时进行重新分配 概览 下面的一些资料可以进行相关的配置: Cluster Level Shard Allocation用于配置集群中节点如 ...

  4. mybatis与数据库访问相关的配置以及设计

    mybatis与数据库访问相关的配置以及设计 mybatis不管如何NB,总是要与数据库进行打交道.通过提问的方式,逐步深入 我们常用的MyBatis配置中哪些是与数据库相关? 数据源配置: < ...

  5. Nginx http相关常用配置总结

    Nginx http相关常用配置总结   by:授客  QQ:1033553122   测试环境 nginx-1.10.0 client_max_body_size Syntax: client_ma ...

  6. Spark 性能相关参数配置详解-压缩与序列化篇

    随着Spark的逐渐成熟完善, 越来越多的可配置参数被添加到Spark中来, 本文试图通过阐述这其中部分参数的工作原理和配置思路, 和大家一起探讨一下如何根据实际场合对Spark进行配置优化. 由于篇 ...

  7. 微信小程序开发环境安装以及相关设置配置

    微信小程序开发环境安装以及相关设置配置 一.安装 软件名称:wechat_devtools_1.02.1907232_x64 软件安装地址:https://developers.weixin.qq.c ...

  8. HBase 安装snappy压缩软件以及相关编码配置

    HBase 安装snappy压缩软件以及相关编码配置 前言 ​ 在使用HBase过程中因为数据存储冗余.备份数等相关问题占用过多的磁盘空间,以及在入库过程中为了增加吞吐量所以会采用相关的压缩算法来压缩 ...

  9. 【保姆级教程】手把手教你进行Go语言环境安装及相关VSCode配置

    [Go语言入门系列]前面的文章: [Go语言入门系列](七)如何使用Go的方法? [Go语言入门系列](八)Go语言是不是面向对象语言? [Go语言入门系列](九)写这些就是为了搞懂怎么用接口 本篇文 ...

随机推荐

  1. Android中判断字符是否为中文、韩文、日文

    我们经常需要在程序中判断一个字符是否为CJK(Chinese.Japanese.Korean)语言的字符. 例如,在Contacts里面程序需要判断联系人姓名的所属语言. 今天为大家介绍一种NameS ...

  2. ZooKeeper 之 zkCli.sh客户端的命令使用

    zkCli.sh的使用 ZooKeeper服务器简历客户端 ./zkCli.sh -timeout 0 -r -server ip:port ./zkCli.sh -timeout 5000 -ser ...

  3. React 源码剖析系列 - 不可思议的 react diff

      简单点的重复利用已有的dom和其他REACT性能快的原理. key的作用和虚拟节点 目前,前端领域中 React 势头正盛,使用者众多却少有能够深入剖析内部实现机制和原理. 本系列文章希望通过剖析 ...

  4. 使用ALVideoPlayerSurface制作视频播放器

    头两天介绍了开源控件包alcinoe,现在利用其中的ALVideoPlayerSurface视频播放控件,实作一个视频播放器. 首先,建一个fmx项目,然后从组件面版,拖放一个TAlVideoPlay ...

  5. 解压Ubuntu的initrd.img的方法

    Ubuntu的initrd.img可以在/boot中找到,通常文件名后面还跟有很长的一串版本号. 为了保险起见,不直接操作原文件,而是把它复制到自己的家目(home)录中.如果你是用root帐号登录的 ...

  6. Thrift之双向通讯

    在实际应用中,却经常会有客户端建立连接后,等待服务端数据的长连接模式,也可以称为双向连接.一.双连接,服务端与客户端都开ThriftServer如果网络环境可控,可以让服务端与客户端互相访问,你可以给 ...

  7. [LeetCode&Python] Problem 821. Shortest Distance to a Character

    Given a string S and a character C, return an array of integers representing the shortest distance f ...

  8. iOS7,iOS8和iOS9的区别

    iOS7,iOS8和iOS9的区别:iOS7.0 1.iOS 7是iOS面世以来在用户界面上做出改变最大的一个操作系统.iOS 7抛弃了以往的拟物化设计,而采用了扁平化设计. 苹果在重新思考 iOS ...

  9. 一致性哈希算法(Consistent Hashing Algorithm)

    一致性哈希算法(Consistent Hashing Algorithm) 浅谈一致性Hash原理及应用   在讲一致性Hash之前我们先来讨论一个问题. 问题:现在有亿级用户,每日产生千万级订单,如 ...

  10. CTF-练习平台-WEB之 web2

    二.web2 打开连接发现... 在火狐浏览器里,按F12点击查看器就可以发现flag