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 版本之角色管理功能介绍
角色功能维护界面:可实现添加.修改.删除角色,向角色添加或删除人员,角色具有哪些菜单的管理功能.
随机推荐
- Spring下配置几种常用连接池
1.连接池概述 数据库连接是一种关键的有限的昂贵的资源,这一点在多用户的网页应用程序中体现得尤为突出.对数据库连接的管理能显著影响到整个应用程序的伸缩性和健壮性,影响到程序的性能指标.数据库连接池正是 ...
- C# 移动及限制移动距离
public class PlaneMove : MonoBehaviour { //h:水平方向的控制,v:前后方向的控制 float h,v; //Speed:飞机的飞行速度 public flo ...
- WebAPI中发送字节数组
今天工作中遇到了一个情景: 前端向后台发送一个请求,希望后台返回一组数据,由于后台返回的数据量很大,希望尽可能压缩响应的大小 我的想法:后台将数据(Short的数组)直接转换成Byte[] 然后将b ...
- CefSharp 支持mp4
效果图: 下载链接:创建wpf项目引用 如下:链接:链接: https://pan.baidu.com/s/1UCJmslLPSDph7VrYhXM9gw 密码: j3n4 链接: https://p ...
- [转]据说200G网盘资料
来源:HACK学习呀 2015cracer入侵入门到精通视频教程 点我查看 trf3 一笔√带过入侵教程 点我查看 ypan [复仇者]新手入门系列(7套) 点我查看 g1tb 菜鸟入门,做的确实不错 ...
- html和css入门
html 单机软件:软件程序和数据都存储在客户端 界面:Tk.PyQt.wxPython库C/S(Client/Server)架构软件:软件程序和数据一部分存在客户端,一部分存在服务器端 界面:Tk. ...
- iOS开发-实现相机app的方法[转载自官方]
This brief code example to illustrates how you can capture video and convert the frames you get to U ...
- JVM(四)JVM的双亲委派模型
1.两种不同的类加载器 从JAVA虚拟机的角度来讲,只存在两种不同的类加载器:一种是启动类加载器(Bootstrap ClassLoader),这个类加载器使用C++语言实现,是虚拟机自身的一部分:另 ...
- Liferay7.0与cas单点登录配置
1.简介 Liferay7.0支持多种登录方式,包括:常规的.opensso.cas.ntlm.ldap.openid.Facebook.Google等. 其中, (1) 常规:则是默认Lif ...
- js便签笔记(9)——解读jquery源码时记录的一些知识点
近来一直利用业余时间在看jquery2.1.1源码,大约看了两千行了.平时看的时候,做了一些笔记,贴出来分享. 1. Array.prototype.slice.call 可以将伪数组转化为真正的数组 ...