JOffice中的权限管理--功能粒度的权限管理配置
JOffice中的权限管理是基于角色的管理策略,采用Spring Security2的配置方式,同时能够结合EXT3来进行整个系统的权限管理,通过使用配置文件,进行整个系统的功能集中管理,包括系统左边的导航菜单,数据列表中的功能操作权限。我们知道,在传统的Web项目中,我们都是采用基于URL进行权限控制的。基于EXT的应用也不例外,只不过我们是需要结合前台的功能菜单一起,前台显示出来的功能菜单,其后台均代表可以访问。
使用方法:
一、先在menu.xml中配置系统的功能,如我们配置角色管理的权限,如下所示:
- <?xml version="1.0" encoding="UTF-8"?>
- <Menus>
- <Items id="SystemSetting" text="系统设置" iconCls="menu-system">
- ...
- <Item id="AppRoleView" iconCls="menu-role" text="角色设置">
- <Function id="_AppRoleList" text="查看角色" iconCls="menu-list">
- <url>/system/listAppRole.do</url>
- </Function>
- <Function id="_AppRoleAdd" text="添加角色" iconCls="menu-add">
- <url>/system/listAppRole.do</url>
- <url>/system/saveAppRole.do</url>
- </Function>
- <Function id="_AppRoleEdit" text="编辑角色" iconCls="menu-add">
- <url>/system/listAppRole.do</url>
- <url>/system/saveAppRole.do</url>
- </Function>
- <Function id="_AppRoleDel" text="删除角色" iconCls="menu-del">
- <url>/system/listAppRole.do</url>
- <url>/system/mulDelAppRole.do</url>
- </Function>
- <Function id="_AppRoleGrant" text="授权角色">
- <url>/system/listAppRole.do</url>
- <url>/system/grantAppRole.do</url>
- </Function>
- </Item>
- ...
- <Item id="ReportTemplateView" iconCls="menu-report" text="报表管理">
- ...
- </Item>
- </Items>
- <!--其他模块 -->
- <Items>
- ...
- </Items>
- </Menus>
<?xml version="1.0" encoding="UTF-8"?>
<Menus>
<Items id="SystemSetting" text="系统设置" iconCls="menu-system">
...
<Item id="AppRoleView" iconCls="menu-role" text="角色设置">
<Function id="_AppRoleList" text="查看角色" iconCls="menu-list">
<url>/system/listAppRole.do</url>
</Function>
<Function id="_AppRoleAdd" text="添加角色" iconCls="menu-add">
<url>/system/listAppRole.do</url>
<url>/system/saveAppRole.do</url>
</Function>
<Function id="_AppRoleEdit" text="编辑角色" iconCls="menu-add">
<url>/system/listAppRole.do</url>
<url>/system/saveAppRole.do</url>
</Function>
<Function id="_AppRoleDel" text="删除角色" iconCls="menu-del">
<url>/system/listAppRole.do</url>
<url>/system/mulDelAppRole.do</url>
</Function>
<Function id="_AppRoleGrant" text="授权角色">
<url>/system/listAppRole.do</url>
<url>/system/grantAppRole.do</url>
</Function>
</Item>
...
<Item id="ReportTemplateView" iconCls="menu-report" text="报表管理">
...
</Item>
</Items>
<!--其他模块 -->
<Items>
...
</Items>
</Menus>
说明:
1.menu.xml为整个系统的功能列表,系统的左边菜单也是从该文件显示出来,如:

2.进入某项菜单中,会进入相应的模块的管理界面,如:

上面的功能“添加角色”,“删除角色”以及管理一栏中的“删除”,“编辑”,“授权”等功能,则对应为menu.xml中的Item下的Function标签的配置,如:
添加角色对应:
- <Function id="_AppRoleAdd" text="添加角色" iconCls="menu-add">
- <url>/system/listAppRole.do</url>
- <url>/system/saveAppRole.do</url>
- </Function>
<Function id="_AppRoleAdd" text="添加角色" iconCls="menu-add">
<url>/system/listAppRole.do</url>
<url>/system/saveAppRole.do</url>
</Function>
其下包括两个Url,一个是/system/listAppRole.do,另一Url /system/saveAppRole.do,表示当我们访问这个功能完成角色添加时,需要访问这两个URL,后台会根据当前用户的角色是否授权访问这个功能而决定是否开放这两个URL给当前用户访问,否则,前台浏览器会弹出一个类似如下的提示,告诉用户当前没有权限访问这个URL。

当然,这种还是要避免出现,因为系统在客户端出现的功能菜单,均是有权访问的。
3.前台的代码配置
前台的用户登录系统后,会有一个全局的变量存储用户的所有权限(其会把所有的角色的配置抽取出来,去掉重复的权限配置),可以在客户端直接检查用户是否有权限访问某一个菜单的功能,如我们检查用户是否直接有访问“添加角色”的功能,则可以调用系统提供的方法:
isGranted(‘_AppRoleAdd’);
该函数返回为true则代表可以访问。
因此我们若要进行更高的权限粒度控制,我们需要把原来的代码进行改装一下。如:
AppRoleView.js需要进行更改。
修改一:
- var toolbar = new Ext.Toolbar({
- id : 'AppRoleFootBar',
- height : 30,
- bodyStyle:'text-align:left',
- items : []
- });
- if(isGranted('_AppRoleAdd')){
- toolbar.add(new Ext.Button({
- iconCls : 'btn-add',
- text : '添加角色',
- handler : function() {
- new AppRoleForm();
- }
- }));
- }
- if (isGranted('_AppRoleDel')) {
- toolbar.add(new Ext.Button({
- iconCls : 'btn-del',
- text : '删除角色',
- handler : function() {
- var grid = Ext.getCmp("AppRoleGrid");
- var selectRecords = grid.getSelectionModel().getSelections();
- if (selectRecords.length == 0) {
- Ext.Msg.alert("信息", "请选择要删除的记录!");
- return;
- }
- var ids = Array();
- for (var i = 0; i < selectRecords.length; i++) {
- ids.push(selectRecords[i].data.roleId);
- }
- AppRoleView.remove(ids);
- }
- }));
- }
var toolbar = new Ext.Toolbar({
id : 'AppRoleFootBar',
height : 30,
bodyStyle:'text-align:left',
items : []
});
if(isGranted('_AppRoleAdd')){
toolbar.add(new Ext.Button({
iconCls : 'btn-add',
text : '添加角色',
handler : function() {
new AppRoleForm();
}
}));
}
if (isGranted('_AppRoleDel')) {
toolbar.add(new Ext.Button({
iconCls : 'btn-del',
text : '删除角色',
handler : function() {
var grid = Ext.getCmp("AppRoleGrid");
var selectRecords = grid.getSelectionModel().getSelections();
if (selectRecords.length == 0) {
Ext.Msg.alert("信息", "请选择要删除的记录!");
return;
}
var ids = Array();
for (var i = 0; i < selectRecords.length; i++) {
ids.push(selectRecords[i].data.roleId);
}
AppRoleView.remove(ids);
}
}));
}
修改二
管理列中的栏目功能:
- if(isGranted('_AppRoleDel'))
- str = '<button title="删除" value=" " class="btn-del" onclick="AppRoleView.remove('+ editId + ')"></button>';
- if(isGranted('_AppRoleEdit'))
- str += ' <button title="编辑" value=" " class="btn-edit" onclick="AppRoleView.edit('+ editId + ')"></button>';
- if(isGranted('_AppRoleGrant'))
- str += ' <button title="授权" value=" " class="btn-grant" onclick="AppRoleView.grant('+ editId + ',\'' + roleName + '\')"> </button>';
if(isGranted('_AppRoleDel'))
str = '<button title="删除" value=" " class="btn-del" onclick="AppRoleView.remove('+ editId + ')"></button>';
if(isGranted('_AppRoleEdit'))
str += ' <button title="编辑" value=" " class="btn-edit" onclick="AppRoleView.edit('+ editId + ')"></button>';
if(isGranted('_AppRoleGrant'))
str += ' <button title="授权" value=" " class="btn-grant" onclick="AppRoleView.grant('+ editId + ',\'' + roleName + '\')"> </button>';
二、同步menu.xml的数据至数据库
打开配置common/config/下的config.properties的这个配置,如下:
isSynMenu=true
打开此配置则表示会把menu.xml中的所有的Function中的url同步到数据库,转给Spring Security进行匹配,则此时进行角色的权限授予才会真正生效。
三、为角色进行相应的授权

在此,将看到该用户访问该模块时,只有“添加角色”这个功能。同样,以上的权限管理也控制着整个系统的左边菜单的权限,如下图所示:

四、拥有超级管理角色,将具有系统的所有访问权限。
该实现涉及到相关比较多的知识,表设计如下所示:

其实现细节,请关注后面的博文《JOffice 的基于角色的权限设计及实现(Spring Security Ext版本)》
JOffice中的权限管理--功能粒度的权限管理配置的更多相关文章
- RabbitMQ 启用页面管理功能并设置权限
RabbitMQ 启用页面管理功能并设置权限 RabbitMQ guest administrator 在安装完 rabbitmq 后,默认有一个 guest/guest 账号密码,但是为了安全,此 ...
- 我的第一个python web开发框架(36)——后台菜单管理功能
对于后台管理系统来说,要做好权限管理离不开菜单项和页面按钮控件功能的管理.由于程序没法智能的知道有什么菜单和控件,哪些人拥有哪些操作权限,所以首先要做的是菜单管理功能,将需要管理的菜单项和各个功能项添 ...
- [转]Asp.Net大型项目实践(11)-基于MVC Action粒度的权限管理【续】【源码在这里】(在线demo,全部源码)
本文转自:http://www.cnblogs.com/legendxian/archive/2010/01/25/1655551.html 接上篇Asp.Net大型项目实践(10)-基于MVC Ac ...
- 【Azure 环境】Azure Key Vault (密钥保管库)中所保管的Keys, Secrets,Certificates是否可以实现数据粒度的权限控制呢?
问题描述 Key Vault (密钥保管库) 能不能针对用户授权实现指定用户只能访问某个或某些特定的key? 如当前有两个用户(User1, User2),在Key Vault中有10个Key,Use ...
- JAVAEE——BOS物流项目11:在realm中授权、shiro的方法注解权限控制、shiro的标签权限控制、总结shiro的权限控制方式、权限管理
1 学习计划 1.在realm中进行授权 2.使用shiro的方法注解方式权限控制 n 在spring文件中配置开启shiro注解支持 n 在Action方法上使用注解 3.★使用shiro的标签进行 ...
- 潭州课堂25班:Ph201805201 django框架 第十三课 自定义404页面,auth系统中的User模型,auth系统权限管理 (课堂笔记)
当 DEBUG=True 时,django 内部的404报错信息, 自带的报错信息, 要自定义404信息,要先把 DEBUG=False , 之后要自定义4040页面,有两种方法, 方法1,在创建40 ...
- TP thinkphp 权限管理 权限认证 功能
(如有打扰,请忽略)阿里云ECS大羊群,2U4G低至1.4折,限实名新用户,需要的点吧https://promotion.aliyun.com/ntms/act/vm/aliyun-group/tea ...
- django项目后台权限管理功能。
对后台管理员进行分角色,分类别管理,每个管理员登录账号后只显示自己负责的权限范围. 创建后台管理数据库 models.py文件内 # 管理员表 class Superuser(models.Model ...
- 通用权限管理系统接口文档V4.2 版本之角色管理功能介绍
角色功能维护界面:可实现添加.修改.删除角色,向角色添加或删除人员,角色具有哪些菜单的管理功能.
随机推荐
- [学习笔记]后缀自动机SAM
好抽象啊,早上看了两个多小时才看懂,\(\%\%\%Fading\) 早就懂了 讲解就算了吧--可以去看看其他人的博客 1.[模板]后缀自动机 \(siz\) 为该串出现的次数,\(l\) 为子串长度 ...
- 货车运输(最大生成树+倍增LCA)
看到第一篇题解的神奇码风--我决定发一篇码风正常的题解造福人类 这题的做法也非常经典,最大生成树\(+LCA\),相当于先贪心一下,在LCA的时候记录一下当前最小的边权 顺便吐槽一下最后一个测试点: ...
- 30_网络编程-socketserver
一.socketserver socketserver可以实现和多个客户端通信.它是在socket的基础上进行了一层封装,也就是说底层还是调用的socket,在py2.7里面叫做Socke ...
- 01_python_初始python
一.初始python python是一门解释型语言,弱类型语言 / python解释器最为常用的是cpython(官方) 弱类型语言: a = 1 a = 'alex' #说明变量a既可以是整 ...
- Color the ball(HDU1556)树状数组
每次对区间内气球进行一次染色,求n次操作后后所有气球染色次数. 树状数组,上下区间更新都可以,差别不大. 1.对于[x,y]区间,对第x-1位减1,第y位加1,之后向上统计 #include<b ...
- CSS3标签显示模式
HTML标签一般分为块标签和行内标签两种类型,它们也称块元素和行内元素.具体如下: 块级元素(block-level) 每个块元素通常都会独自占据一整行或多整行,可以对其设置宽度.高度.对齐等属性,常 ...
- MySQL查询50例
创建表和关系 /* 创建表 */ /*年级表*/ DROP TABLE IF EXISTS `class_grade`; CREATE TABLE `class_grade` ( `gid` int( ...
- python读取文件首行和最后一行
python读取文件最后一行两种方式 1)常规方法:从前往后依次读取 步骤:open打开文件. 读取文件,把文件所有行读入内存. 遍历所有行,提取指定行的数据. 优点:简单,方便 缺点:当文件大了以后 ...
- 5_Python OOP
1. 实例属性和类属性 (1) 实例属性在构造函数__init__中定义,定义时以self作为前缀,只能通过实例名访问 (2) 类属性在类中方法之外单独定义,还可以在程序中 ...
- mongo开发标准(待完善)
MongoDB开发规范 1.mongoDB库的设计mongodb数据库命名规范:db_xxxx禁止使用任何 " _ "(下划线)外的特殊字符 禁止使用数字打头的库名 数据库名最多为 ...