
注册后台登陆用户选择对应角色,角色表中 auth_id_list字符串()字段对应权限表中所拥有的权限
权限 *** 作:
权限的添加对数据的有效性,在validate(继承think下的validate)中对数据的场景验证 文件名要和控制器名一直,如果验证不通过 返回的结果用error提示时 要进行分割! 添加权限的无限极分类
验证场景继承于think下的validate 看手册
在选择顶级分类时pid等于0 当然对输入text文件也要进行相对应的阻止
Readonly和disable的区别是readonly可以接收到了post提交值
权限的展示:控制器读取即可
注意:如何读取到父类权限名? 连表 ? 否认 介绍一个牛逼的方法经常用到
把id作为数组的下标 根据当前的pid找到数据下标为pid里面的name即可!
权限的编辑:在显示页面 编辑传入id读取回显
默认选中当前的父类这里只需要用jq即可
$("select[name='pid']").val("{$Info.pid}") /默认当前点击进来的父类
再利用jq判断pid 等于0 等于就是顶级权限 就不显示控制器和方法 设置为不可用
在编辑时候如果选择权限的时不可在自己的子孙下面使用jq递归实现
先移除当前的自身在判断循环出来的数据(id)是否等于当前的pid 等于就移除
[if !supportLists]2、[endif] 角色表的curd *** 作
取出角色表所有的数据(角色表中auth_id_list对应的是权限中的id)
两步骤: 1取出数据把id作为数据的id 2:根据pid分钟 查出id
对于模板的遍历显示:遍历 $children里面的id 而$auths里面的$id中的name就是值!
在提交的过程中CheckBox是一个数组 通过在模型中的前置钩子来对数据分类 implode函数 验证器---省略
以后在模板中凡是需要取出含有(父子孙)层级关系的数据,可以使用下面这个技巧。
技巧一:取出所有的权限:并且以auth_id为每个元素的下标。
技巧二:取出所有的权限,通过pid进行分组,把具有相同的pid划分为同一组
角色编辑功能:
Id传入查询出数据 模板显示
注意:如何默认勾选角色已有的权限 通过jq(jq可真的个好东西).....
先获取得到的所有的auth_id_list的值 通过Jq中split 分割数组 在设置默认选择即可
角色的列表展示
把一个角色所拥有的权限都查出来,这里需要利用到两个mysql函数:
FIND_IN_SET和group_concat(字段)
[if !supportLists]l [endif]FIND_IN_SET(str,strlist) :
作用:查询出子串str,是否在由逗号分隔的目标字符串strlist中存在。
存在则返回所在目标字符串strlist的所在位置,不存在则返回0。
[if !supportLists]l [endif]group_concat(字段)
作用:主要根据某个字段进行分组,把相同字段的值连接在一起。
默认连接符号是逗号,如果用|连接则:
根据cat_id字段进行分组,把具有相同cat_id的title字段值连接在一起。
查询出当前角色所拥有的全部权限拼接在一起:
对模板的输出
实现不同用户登录展示不同后台菜单
[if !supportLists]a、[endif]思路:用户登录成功的时候,获取到role_id。
[if !supportLists]b、[endif]通过role_id获取角色表的auth_id_list字段
[if !supportLists]c、[endif]通过权限表auth_id只要在auth_id_list字段存在即可,查出所拥有的权限
超级管理员auth_id_list字段的值为*,代表拥有后台 *** 作的所有权限。
步骤1:在用户登录成功的模型的checkUser方法中,通过角色id把当前角色所有的权限写入到session。
后台left.html模板文件中,只需要显示一级和二级的权限即可:
我们需要构造出一个特定数据结构的数据:
如下:通过每个顶级(pid=0)的元素加个一个sonsAuth下标存储其对应的子级权限
[
auth_name=>‘用户管理’
auth_id =>46
pid =>0
......
sonsAuth=>[
[auth_name=>用户列表,’pid’=>46]
[auth_name=>用户添加,’pid’=>46]
.....
]
]
超级权限(*)和普通权限
通过登陆之后用户表中的role_id来得到role角色表中auth_id_list的权限的字段
在left.html取出session中的权限,遍历访问的菜单
权限防翻墙
结个尾:用ajax控制用户当前的状
态:无非就是通过ajax提交数据到PHP PHP来进行更新 更新返回对应的结果
先给标签加一个a标签,并且阻止默认行为,同时加一个is_active(是否禁用)和user_id属性,目的是获取当前记录的状态值和主键值,并且绑定类名为changeActive。
----------搞完了一身轻松
禁止的权限规则集如果权限规则不是一个集合,因为只有与用户或角色关联的权限规则才允许访问,所以用户的权限是一个闭合区域,不想用户拥有某些权限时,只要不进行关联授权即可。如果权限规则使用通配符变成一个集合,那么用户的权限将变成一个开放区域,比如上面的论坛文章列表,假设论坛文章按照“版面/作者/文章标题”作为资源命名,那么将(阅览, 版面/作者/*)授权给某用户时,该用户允许阅览该版面下该作者的所有文章,假设现在有一种管理需求要求某用户可以阅览某版面下某作者除某几种文章标题外的所有文章,这样单纯的允许授权难以实现这个管理需求。
法律有许可和禁止的区别,那么权限管理也应该有许可和禁止两种授权,上面的不允许访问某几种文章标题的文章就是一种禁止规则,如果将这种禁止规则合并到允许规则中,就可以解决上面的问题。这就相当于画了一个大圈表示可以访问的区域,但是大圈里面的某些小圈是不可以访问的区域。这又带来一个问题,假设允许的和禁止的规则重叠,以谁为准?这个没有一个准则,不过基于安全性考虑,应该采用禁止优先,只要是禁止的集合,就算有允许的集合重叠,也不允许访问。
提高权限验证效率
使用关系数据库存储权限数据时,权限数据表更新和查询的 *** 作频繁度通常小于1:9,也就是这是一个典型的OLAP系统,以查询为主,所以可以采用OLAP的优化策略进行优化,但是大多数优化策略都不具备实时性,如果兼顾实时性和效率要求,可以单独创建一个内存数据库,这个内存数据库只存放用户、资源、 *** 作关联关系,也就是(用户, *** 作, 资源)集合,如果用户通过角色关联到权限规则,那么将这些用户到权限规则的间接传递关系转变成直接传递关系保存。这个内存数据库就相当于权限数据的缓存,可以保证很高的查询效率,并且该内存数据库与权限管理保持同步,可以保证实时性。
安装和配置
附件是权限管理和权限验证的实现,也有用户管理的演示,不过用户管理很粗糙,实际使用需要做进一步开发,之所以没有开发相对完善的用户管理,是因为现在已有的系统通常都有完善的用户管理。
下面简单讲解安装配置,只在Tomcat5523+MySQL5037+jre1.5.0_12下测试过。
1. 下载rbac+profile.rar,解压,得到一系列文件,文件用途如下:
profile.admin.src.v1.jar 用户管理源代码
rbac.admin.src.v2.jar 权限管理源代码
rbac.auth.src.v2.jar 权限验证源代码
profile.v1.MySQL5.sql 用户管理用户数据表
profile.war 用户管理WEB系统
rbac.v2.MySQL5.sql 权限管理数据表
rbac.war 权限管理WEB系统
2. 创建数据库profile,使用UTF-8导入profile.v1.MySQL5.sql到profile,使用下面SQL创建用户root/1:
Insert into T_PROFILE(USER_ID, USER_NAME, USER_PASSWORD) values(‘1’, ‘root’, sha1(‘1’))
如果创建过先前SSO单点登陆的用户数据表,可以跳过这步,使用先前的数据表。
3. 创建数据库rbac,使用UTF-8导入rbac.v2.MySQL5.sql到rbac。
4. 拷贝profile.war和rbac.war到Tomcat5523/webapps/,会自动生成profile和rbac目录。
5. 参考http://blog.chinaunix.net/u1/52224/showart_412714.html配置单点登陆,因为权限管理和用户管理需要依赖单点登陆。
6. 下载相关依赖Java库:
下载cglib最新版本http://cglib.sourceforge.net/,拷贝asm.jar和cglib-2.1.3.jar到Tomcat/shared/lib。
下载c3p0最新版本http://sourceforge.net/projects/c3p0,拷贝c3p0-0.9.1.1.jar到Tomcat/shared/lib。
下载mysql-connector最新版本http://sourceforge.net/projects/mmmysql/,拷贝mysql-connector-java-5.0.4-bin.jar到Tomcat/shared/lib。
下载dwr最新版本http://getahead.org/dwr,拷贝dwr2.0.1.jar到Tomcat/shared/lib。
7. 打开profile/ WEB-INF/classes/的rbac_auth.properties、sso_agent.properties、profile_admin.properties。
# 修改为合适配置
# rbac_auth.properties
rbac.auth.db.ds.c3p0.url=jdbc:mysql://localhost/rbac
rbac.auth.db.ds.c3p0.user=root
rbac.auth.db.ds.c3p0.password=1
# sso_agent.properties
sso.passport.login=http://bsmith-cn:8080/sso/passport/login.srv
sso.passport.logout=http://bsmith-cn:8080/sso/passport/logout.srv
# profile_admin.properties
profile.admin.db.ds.c3p0.url=jdbc:mysql://localhost/profile
profile.admin.db.ds.c3p0.user=root
profile.admin.db.ds.c3p0.password=1
8. 打开rbac/WEB-INF/classes/下的rbac_admin.properties、rbac_auth.properties、sso_agent.properties。
# 修改为合适配置
# rbac_auth.properties
rbac.auth.db.ds.c3p0.url=jdbc:mysql://localhost/rbac
rbac.auth.db.ds.c3p0.user=root
rbac.auth.db.ds.c3p0.password=1
# sso_agent.properties
sso.passport.login=http://bsmith-cn:8080/sso/passport/login.srv
sso.passport.logout=http://bsmith-cn:8080/sso/passport/logout.srv
# rbac_admin.properties
rbac.admin.profile.explorer=http://bsmith-cn:8080/profile/admin/explorer.jsp?
rbac.admin.profile.profile=http://bsmith-cn:8080/profile/admin/profile.jsp?
rbac.admin.db.rbac.ds.c3p0.url=jdbc:mysql://localhost/rbac
rbac.admin.db.rbac.ds.c3p0.user=root
rbac.admin.db.rbac.ds.c3p0.password=1
欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)