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 版本之角色管理功能介绍
角色功能维护界面:可实现添加.修改.删除角色,向角色添加或删除人员,角色具有哪些菜单的管理功能.
随机推荐
- mysql命令行客户端结果分页浏览
转载请注明出处:http://xiezhenye.com/2008/06/mysql%e5%91%bd%e4%bb%a4%e8%a1%8c%e5%ae%a2%e6%88%b7%e7%ab%af%e7% ...
- Python 数据结构与算法—— 快排
1. 先从待排序的数组中找出一个数作为基准数(取第一个数即可),然后将原来的数组划分成两部分:小于基准数的左子数组和大于等于基准数的右子数组.然后对这两个子数组再递归重复上述过程,直到两个子数组的所有 ...
- asp.net core 使用identityServer4的密码模式来进行身份认证(2) 认证授权原理
前言:本文将会结合asp.net core 认证源码来分析起认证的原理与流程.asp.net core版本2.2 对于大部分使用asp.net core开发的人来说. 下面这几行代码应该很熟悉了. s ...
- vs2017使用rdlc实现批量打印
接着上一篇:上一篇写了安装,这篇直接搞定批量打印,A4纸横版竖版页面设计,正式开始.(我的表达不怎么好,我尽量发图片都是程序员一点就通) 一.界面展示 忽略界面设计丑 查看预览界面,因为有数据就不截全 ...
- 【转】基于Token的WEB后台认证机制
原谅地址:http://www.cnblogs.com/xiekeli/p/5607107.html 几种常用的认证机制 HTTP Basic Auth HTTP Basic Auth简单点说明就是每 ...
- openvSwitch 基本命令
建立ovs接口连接两个namespace组成二层网络 环境搭建拓扑 br0 +--------------------------------------+ +--+ +--+ +---+ | tap ...
- Git入门--创建版本库,关联远程库,从远程库下载
1.(先进入项目文件夹)通过命令 git init 把这个目录变成git可以管理的仓库 git init 2.把文件添加到版本库中,使用命令 git add .添加到暂存区里面去,不要忘记后面的小数点 ...
- API网关【gateway 】- 1
最近在公司进行API网关重写,公司内采用serverMesh进行服务注册,调用,这里结合之前学习对API网关服务进行简单的总结与分析. 网关的单节点场景: 网关的多节点场景: 这里的多节点是根据模块进 ...
- BZOJ 1016--[JSOI2008]最小生成树计数(kruskal&搜索)
1016: [JSOI2008]最小生成树计数 Time Limit: 1 Sec Memory Limit: 162 MBSubmit: 7429 Solved: 3098[Submit][St ...
- Swift5 语言指南(二十一) 嵌套类型
通常创建枚举以支持特定类或结构的功能.类似地,定义纯粹在更复杂类型的上下文中使用的实用程序类和结构可能是方便的.为此,Swift允许您定义嵌套类型,从而在它们支持的类型定义中嵌套支持枚举,类和结构. ...