JOffice中的权限管理是基于角色的管理策略,采用Spring Security2的配置方式,同时能够结合EXT3来进行整个系统的权限管理,通过使用配置文件,进行整个系统的功能集中管理,包括系统左边的导航菜单,数据列表中的功能操作权限。我们知道,在传统的Web项目中,我们都是采用基于URL进行权限控制的。基于EXT的应用也不例外,只不过我们是需要结合前台的功能菜单一起,前台显示出来的功能菜单,其后台均代表可以访问。

使用方法:

一、先在menu.xml中配置系统的功能,如我们配置角色管理的权限,如下所示:

  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <Menus>
  3. <Items id="SystemSetting" text="系统设置" iconCls="menu-system">
  4. ...
  5. <Item id="AppRoleView" iconCls="menu-role" text="角色设置">
  6. <Function id="_AppRoleList" text="查看角色" iconCls="menu-list">
  7. <url>/system/listAppRole.do</url>
  8. </Function>
  9. <Function id="_AppRoleAdd" text="添加角色" iconCls="menu-add">
  10. <url>/system/listAppRole.do</url>
  11. <url>/system/saveAppRole.do</url>
  12. </Function>
  13. <Function id="_AppRoleEdit" text="编辑角色" iconCls="menu-add">
  14. <url>/system/listAppRole.do</url>
  15. <url>/system/saveAppRole.do</url>
  16. </Function>
  17. <Function id="_AppRoleDel" text="删除角色" iconCls="menu-del">
  18. <url>/system/listAppRole.do</url>
  19. <url>/system/mulDelAppRole.do</url>
  20. </Function>
  21. <Function id="_AppRoleGrant" text="授权角色">
  22. <url>/system/listAppRole.do</url>
  23. <url>/system/grantAppRole.do</url>
  24. </Function>
  25. </Item>
  26. ...
  27. <Item id="ReportTemplateView" iconCls="menu-report" text="报表管理">
  28. ...
  29. </Item>
  30. </Items>
  31. <!--其他模块 -->
  32. <Items>
  33. ...
  34. </Items>
  35. </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标签的配置,如:
添加角色对应:

  1. <Function id="_AppRoleAdd" text="添加角色" iconCls="menu-add">
  2. <url>/system/listAppRole.do</url>
  3. <url>/system/saveAppRole.do</url>
  4. </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需要进行更改。

修改一:

  1. var toolbar = new Ext.Toolbar({
  2. id : 'AppRoleFootBar',
  3. height : 30,
  4. bodyStyle:'text-align:left',
  5. items : []
  6. });
  7. if(isGranted('_AppRoleAdd')){
  8. toolbar.add(new Ext.Button({
  9. iconCls : 'btn-add',
  10. text : '添加角色',
  11. handler : function() {
  12. new AppRoleForm();
  13. }
  14. }));
  15. }
  16. if (isGranted('_AppRoleDel')) {
  17. toolbar.add(new Ext.Button({
  18. iconCls : 'btn-del',
  19. text : '删除角色',
  20. handler : function() {
  21. var grid = Ext.getCmp("AppRoleGrid");
  22. var selectRecords = grid.getSelectionModel().getSelections();
  23. if (selectRecords.length == 0) {
  24. Ext.Msg.alert("信息", "请选择要删除的记录!");
  25. return;
  26. }
  27. var ids = Array();
  28. for (var i = 0; i < selectRecords.length; i++) {
  29. ids.push(selectRecords[i].data.roleId);
  30. }
  31. AppRoleView.remove(ids);
  32. }
  33. }));
  34. }
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);
}
}));
}

修改二
    管理列中的栏目功能:

  1. if(isGranted('_AppRoleDel'))
  2. str = '<button title="删除" value=" " class="btn-del" onclick="AppRoleView.remove('+ editId + ')"></button>';
  3. if(isGranted('_AppRoleEdit'))
  4. str += '&nbsp;<button title="编辑" value=" " class="btn-edit" onclick="AppRoleView.edit('+ editId + ')"></button>';
  5. if(isGranted('_AppRoleGrant'))
  6. str += '&nbsp;<button title="授权" value=" " class="btn-grant" onclick="AppRoleView.grant('+ editId + ',\'' + roleName + '\')">&nbsp;</button>';
if(isGranted('_AppRoleDel'))
str = '<button title="删除" value=" " class="btn-del" onclick="AppRoleView.remove('+ editId + ')"></button>';
if(isGranted('_AppRoleEdit'))
str += '&nbsp;<button title="编辑" value=" " class="btn-edit" onclick="AppRoleView.edit('+ editId + ')"></button>';
if(isGranted('_AppRoleGrant'))
str += '&nbsp;<button title="授权" value=" " class="btn-grant" onclick="AppRoleView.grant('+ editId + ',\'' + roleName + '\')">&nbsp;</button>';

二、同步menu.xml的数据至数据库

打开配置common/config/下的config.properties的这个配置,如下:
isSynMenu=true

打开此配置则表示会把menu.xml中的所有的Function中的url同步到数据库,转给Spring Security进行匹配,则此时进行角色的权限授予才会真正生效。

三、为角色进行相应的授权

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

四、拥有超级管理角色,将具有系统的所有访问权限。

该实现涉及到相关比较多的知识,表设计如下所示:

其实现细节,请关注后面的博文《JOffice 的基于角色的权限设计及实现(Spring Security Ext版本)》

JOffice中的权限管理--功能粒度的权限管理配置的更多相关文章

  1. RabbitMQ 启用页面管理功能并设置权限

    RabbitMQ 启用页面管理功能并设置权限 RabbitMQ guest administrator  在安装完 rabbitmq 后,默认有一个 guest/guest 账号密码,但是为了安全,此 ...

  2. 我的第一个python web开发框架(36)——后台菜单管理功能

    对于后台管理系统来说,要做好权限管理离不开菜单项和页面按钮控件功能的管理.由于程序没法智能的知道有什么菜单和控件,哪些人拥有哪些操作权限,所以首先要做的是菜单管理功能,将需要管理的菜单项和各个功能项添 ...

  3. [转]Asp.Net大型项目实践(11)-基于MVC Action粒度的权限管理【续】【源码在这里】(在线demo,全部源码)

    本文转自:http://www.cnblogs.com/legendxian/archive/2010/01/25/1655551.html 接上篇Asp.Net大型项目实践(10)-基于MVC Ac ...

  4. 【Azure 环境】Azure Key Vault (密钥保管库)中所保管的Keys, Secrets,Certificates是否可以实现数据粒度的权限控制呢?

    问题描述 Key Vault (密钥保管库) 能不能针对用户授权实现指定用户只能访问某个或某些特定的key? 如当前有两个用户(User1, User2),在Key Vault中有10个Key,Use ...

  5. JAVAEE——BOS物流项目11:在realm中授权、shiro的方法注解权限控制、shiro的标签权限控制、总结shiro的权限控制方式、权限管理

    1 学习计划 1.在realm中进行授权 2.使用shiro的方法注解方式权限控制 n 在spring文件中配置开启shiro注解支持 n 在Action方法上使用注解 3.★使用shiro的标签进行 ...

  6. 潭州课堂25班:Ph201805201 django框架 第十三课 自定义404页面,auth系统中的User模型,auth系统权限管理 (课堂笔记)

    当 DEBUG=True 时,django 内部的404报错信息, 自带的报错信息, 要自定义404信息,要先把 DEBUG=False , 之后要自定义4040页面,有两种方法, 方法1,在创建40 ...

  7. TP thinkphp 权限管理 权限认证 功能

    (如有打扰,请忽略)阿里云ECS大羊群,2U4G低至1.4折,限实名新用户,需要的点吧https://promotion.aliyun.com/ntms/act/vm/aliyun-group/tea ...

  8. django项目后台权限管理功能。

    对后台管理员进行分角色,分类别管理,每个管理员登录账号后只显示自己负责的权限范围. 创建后台管理数据库 models.py文件内 # 管理员表 class Superuser(models.Model ...

  9. 通用权限管理系统接口文档V4.2 版本之角色管理功能介绍

    角色功能维护界面:可实现添加.修改.删除角色,向角色添加或删除人员,角色具有哪些菜单的管理功能.

随机推荐

  1. Page_Load是怎样被执行的

    关于Asp.Net的生命周期的文章,很多很多,不管是管道生命周期,还是页面生命周期,图文并茂的文章并不少,我就不说了,我只是在复习这些知识点的时候,想具体知道一个页面的Page_Load方法到底是怎么 ...

  2. sharepoint support ashx file

    Hello, I did the steps from the tutorial you are using. I have received the same error when I did no ...

  3. Java 泛型通配符

    package com.waston; import java.util.*; public class Main { public static void main(String[] args) { ...

  4. 转---写一个网页进度loading

    作者:jack_lo www.jianshu.com/p/4c93f5bd9861 如有好文章投稿,请点击 → 这里了解详情 loading随处可见,比如一个app经常会有下拉刷新,上拉加载的功能,在 ...

  5. Swift5 语言参考(一) 关于语言参考

    本系列文章的这一部分描述了Swift编程语言的形式语法.此处描述的语法旨在帮助您更详细地理解语言,而不是允许您直接实现解析器或编译器. Swift语言相对较小,因为Swift代码中几乎无处不在的许多常 ...

  6. WCF:wsdl

  7. Java swing皮肤(look and feel)大全

    ########## 优选 ########## Weblaf:非常赞的套件,界面现代.简约.依赖包较少. 有开源也有商业协议,个人最喜欢的皮肤.https://github.com/mgarin/w ...

  8. Django设置联合唯一约束 -- migrate时报错处理

    异常信息: a unique database constraint for 2 or more fields together 场景描述: 对于ORM中多对多关系的中间表,如果该关系表是手动创建的, ...

  9. dbvisulizer 存储过程

    --/ CREATE PROCEDURE test () BEGIN DECLARE v CHAR(10) DEFAULT 'Hello';SELECT CONCAT(v, ', ', current ...

  10. CentOS6.7-64bit编译hadoop2.6.4

    1.下载maven(apache-maven-3.3.3-bin.tar.gz) http://archive.apache.org/dist/maven/maven-3/3.3.3/binaries ...