`
lym6520
  • 浏览: 704114 次
  • 性别: Icon_minigender_1
  • 来自: 福建
社区版块
存档分类
最新评论

系统权限模块设计(ps:有图有真相!)

阅读更多
    在百度百科里查到了权限管理系统的定义:
引用
权限管理,一般指根据系统设置的安全规则或者安全策略,用户可以访问而且只能访问自己被授权的资源,不多不少。权限管理几乎出现在任何系统里面,只要有用户和密码的系统。

    任何一个系统都有对应的权限管理模块,比较粗糙的系统是在开发的时候就定义了哪些类型的用户拥有某些权限,在开发过程中就把权限给定死了;有的则是通过模糊匹配url来进行权限的控制,但是这些日后维护起来会比较麻烦,可能还有其他很多种方式来进行权限的管理,但是不管通过何种方式,其目的都是为了能够安全、灵活、方便的操作,而且还不能影响系统性能。

    以下是我自己开发的后台管理系统的权限模块,分享一下我设计的权限模块的开发思路:
    后台管理系统是基于Spring + struts2.0 + hibernate + Ext 3.2.1架构开发的,因为前台主要是以Ext为主,所以权限模块也是在围绕Ext树进行设计的。使用Ext开发过的同学都知道Ext.tree.TreePanel的节点是由Ext.tree.TreeNode定义的,其中Ext.tree.TreeNode中有个href属性,接下来的权限控制就是围绕这个href进行控制的。
    先来看看数据模型:

从模型中可以看到权限表引用了菜单管理这张表,扩展这张权限表的目的是为了更灵活的对权限进行管理,而不单单只是围绕菜单树,然后通过权限关联表进行角色权限的维护。

    在找百度百科看看权限管理的分类
引用
权限管理分类
  从控制力度来看,可以将权限管理分为两大类:   
1,功能级权限管理;   
2,数据级权限管理。   
    从控制方向来看,也可以将权限管理分为两大类:   
1,从系统获取数据,比如查询订单、查询客户资料;   
2,向系统提交数据,比如删除订单、修改客户资料。


    接下来进入权限模块的开发阶段,系统是根据角色进行权限控制的,在用户登入系统的时候,获取用户的角色信息,然后获取角色的权限信息也就是URI列表保存在session中(ps:权限信息不一定保存在session中,也可以借助第三方存储,比如:memcache),通过过滤器来进行访问控制(判断请求的URI是否在列表当中)。当然前台js也要保存这些URI,这样就可以同时控制界面元素是否展现了。

过滤器控制:
List<String> roleAccessList = (List<String>) session.getAttribute(sessionKey);
		String URL = req.getServletPath();
		if(checkNoFilterType(URL) || checkNoFilterURI(URL) || roleAccessList.contains(URL)) {
			//如果是免过滤地址或免过滤类型则通过
			chain.doFilter(request, response);
		} else {
			
			String ajaxTag = req.getHeader("Request-By");//Ext
			resp.setCharacterEncoding("UTF-8");
			resp.setContentType("text/html;charset=utf-8");
			PrintWriter out = resp.getWriter();
			if(ajaxTag == null || !ajaxTag.trim().equalsIgnoreCase("Ext")){
				//resp.sendRedirect(this.redirectUri);
				out.print("权限受限!");
			}else{
				Map<String, Object> result = new HashMap<String, Object>();
				result.put("success", false);
				result.put("noPermission",true);
				result.put("redirectUri", this.redirectUri);
				out.print(Json.object2Json(result));
			}
			
			out.flush();
			out.close();
		}


前台js控制:
P_roleAccessUris = '<%=session.getAttribute("userRoleAccessList") != null ? session.getAttribute("userRoleAccessList").toString() : ""%>';//可访问权限uris
	
	/**
	* 判断用户是否有uri访问权限
	* @param url
	* @return boolean
	*/
	function Pfn_enableAccess(url){
		url = url.substr(P_basePath.length);
		if(P_roleAccessUris.indexOf(url) != -1){
			return true;
		}
		return false;
	}
	
	// Default headers to pass in every request
	Ext.Ajax.defaultHeaders = {
	    'Request-By': 'Ext'	//标识ajax请求
	};
	
	// ajax回调函数处理系统退出      
	Ext.Ajax.on('requestcomplete',checkStatus, this);         
	function checkStatus(conn,response,options){
    	var json = Ext.decode(response.responseText);
    	if(typeof json == 'object' 
			&& !json.success ){
			if(json.timeout){
				alert("登入超时,系统将自动跳转到登陆页面,请重新登入!");
				top.window.location.href = P_basePath + json.redirectUri;
				return false;	
			}else if(json.noPermission){
				alert("权限受限!");
				return false;
			}						
		}
	          
	} 


最后贴些图上来看看:

权限管理模块:


接下来看下一普通用户的权限信息及登入界面:
普通用户权限信息(选中为已分配权限):

普通用户登入界面:


补充说明:
有些同学可能没看明白,认为权限粒度太粗,这里我特别说明一下:控制不当单只是用户入口(菜单)的控制,也包括了操作控制(即包含了权限过滤器指定下的所有URL)。完全可以控制到每一个操作。
  • 大小: 18.7 KB
  • 大小: 37.6 KB
  • 大小: 30.7 KB
  • 大小: 22.3 KB
分享到:
评论
28 楼 tanwencan 2011-03-14  
求extjs书。
27 楼 ltian 2011-03-10  
lym6520 写道
以下是RBAC0的模型:


在我的系统权限模块设计中,除了用户跟角色是一对一关系外其他完全符合RBAC0模型,当然这要根据各自系统的特色来分析是否有必要给一个用户分配多个角色,这个在后期完全是可以扩展的。欢迎大家拍砖!


此模型只是级别1的RBAC。而且用户与角色是多对多的关系是级别1的RBAC的核心。您的设计,和RBAC大相径庭,我的砖拍重了,但是是实话。你的设计,与RBAC相差十万八千里。
26 楼 lym6520 2011-01-27  
以下是RBAC0的模型:


在我的系统权限模块设计中,除了用户跟角色是一对一关系外其他完全符合RBAC0模型,当然这要根据各自系统的特色来分析是否有必要给一个用户分配多个角色,这个在后期完全是可以扩展的。欢迎大家拍砖!
25 楼 mingjian01 2011-01-27  
<div class="quote_title">kyfxbl 写道</div>
<div class="quote_div">不给力,粒度太粗。比如A,B都能进入用户管理页面,但A能做删除和编辑操作,B只能编辑不能删除。<br><br>你这个模型实现不了。建议你参考一下RBAC模型</div>
<p><br><br>十分同意kyfxbl 的观点,LZ如果把角色可以控制的资源类型仅仅设定为页面以后是会出以上问题的,粒度不够细化,参考RBAC模型把资源表重新设计一下,最好把用户组的功能也加上去</p>
<p> </p>
24 楼 lym6520 2011-01-26  
godymoon 写道
lym6520 写道
godymoon 写道
这个权限中的URL能把系统中的URL完全包含吗?还有对以查询字符串结尾的URL该如何处理?

是否包含系统的全部url取决于过滤器的配置,还有req.getServletPath()这个返回的是请求的部分URL,不会包含请求参数。

不是说过滤器,而是往权限表里插入url,这个要把系统的所有url都要插进去吧?如何保证url不会遗漏

不一定要存储系统所有的url,这个在开发初期就应该确定清楚,如果遗漏了哪些url,测试过程中就会提示无权限。
23 楼 godymoon 2011-01-26  
lym6520 写道
godymoon 写道
这个权限中的URL能把系统中的URL完全包含吗?还有对以查询字符串结尾的URL该如何处理?

是否包含系统的全部url取决于过滤器的配置,还有req.getServletPath()这个返回的是请求的部分URL,不会包含请求参数。

不是说过滤器,而是往权限表里插入url,这个要把系统的所有url都要插进去吧?如何保证url不会遗漏
22 楼 lym6520 2011-01-25  
kyfxbl 写道
lym6520 写道
kyfxbl 写道
不给力,粒度太粗。比如A,B都能进入用户管理页面,但A能做删除和编辑操作,B只能编辑不能删除。

你这个模型实现不了。建议你参考一下RBAC模型

怎么不能做呢?我只要分配两个角色就可以了,比如角色rleA可以删除和编辑操作,roleB只能编辑,把这两个用户分别赋予A用户和B用户。


我知道你的意思,不是这个问题。你这个模型本身粒度太粗了。只有一个菜单,你总不能说编辑和删除它是2个菜单吧。

RBAC1级的模型,URL和操作都是分离的,然后URL还有树形级联关系。RBAC2,3级模型就更复杂了,不过对于一般的场景,1级的模型已经够用了。你这个模型,0级都算不上。


你可能误解了,菜单管理和权限表本质是一样的,你可以把它当做一张表。比如你可以不分配菜单给用户,但是菜单下的操作功能你可以分配给用户,只是用户有这个操作功能,没有提供用户操作入口而已。
21 楼 zuiyanwangyue 2011-01-25  
kyfxbl 写道
lym6520 写道
kyfxbl 写道
不给力,粒度太粗。比如A,B都能进入用户管理页面,但A能做删除和编辑操作,B只能编辑不能删除。

你这个模型实现不了。建议你参考一下RBAC模型

怎么不能做呢?我只要分配两个角色就可以了,比如角色rleA可以删除和编辑操作,roleB只能编辑,把这两个用户分别赋予A用户和B用户。


我知道你的意思,不是这个问题。你这个模型本身粒度太粗了。只有一个菜单,你总不能说编辑和删除它是2个菜单吧。

RBAC1级的模型,URL和操作都是分离的,然后URL还有树形级联关系。RBAC2,3级模型就更复杂了,不过对于一般的场景,1级的模型已经够用了。你这个模型,0级都算不上。



kyfxbl说的对
20 楼 kyfxbl 2011-01-25  
lym6520 写道
kyfxbl 写道
不给力,粒度太粗。比如A,B都能进入用户管理页面,但A能做删除和编辑操作,B只能编辑不能删除。

你这个模型实现不了。建议你参考一下RBAC模型

怎么不能做呢?我只要分配两个角色就可以了,比如角色rleA可以删除和编辑操作,roleB只能编辑,把这两个用户分别赋予A用户和B用户。


我知道你的意思,不是这个问题。你这个模型本身粒度太粗了。只有一个菜单,你总不能说编辑和删除它是2个菜单吧。

RBAC1级的模型,URL和操作都是分离的,然后URL还有树形级联关系。RBAC2,3级模型就更复杂了,不过对于一般的场景,1级的模型已经够用了。你这个模型,0级都算不上。
19 楼 ltian 2011-01-25  
lym6520 写道
ltian 写道
楼主写着东为了让人赞扬获取快感和自信还是要让人批判从而提高自己呢?

不管是批评还是赞扬,只想自己能够做的更好。


能够满足自己用的就很好了。不用考虑其他的了,中国人目前还没到到大工业分工协作时代,能够满足自己的需求就好。只为满足自己的东西拿出来讨论真的没必要。中国软件业一直在低水平重复开发,从10年前权限就有人开始搞,还是有人再不停的搞,但是没有什么突破。我记得论坛每过一段时间就有人拿出一些权限的东西过来讨论,最后大家总是讨论的很不愉快。
18 楼 lym6520 2011-01-25  
solomon 写道
  数据级的权限控制是怎么做的? 能交流下么?


引用
数据级权限,无外乎这些类型:
1,数据库行列级:比如领导查询数据范围和普通员工查询的数据范围不同,客户经理能够查询客户联系方式字段,而其他人不能查看客户联系方式字段。
2,字段内容控制:比如普通审查员审查50w以下财务数据,刚入职客户经理只能将客户级别调整不能超过3级。

从用户与数据的交互方向可以分为2大类:
1,从系统获取数据(查询);
2,向系统提交数据之前的判断。


目前,在我的系统权限模块里面还没有涉及到数据级的权限控制,也考虑过这方面的控制,但控制起来相对麻烦,所以我的解决方案是在开发中就确定这方面的权限控制,查询页面相同,但请求的action不同,在action中处理请求参数过滤等。

当然,如果不怕麻烦的话,你可以在权限模块处理上添加一些参数过滤处理,然后增加一个参数过滤器来处理,总之这样控制的话麻烦...
17 楼 lym6520 2011-01-25  
kyfxbl 写道
不给力,粒度太粗。比如A,B都能进入用户管理页面,但A能做删除和编辑操作,B只能编辑不能删除。

你这个模型实现不了。建议你参考一下RBAC模型

怎么不能做呢?我只要分配两个角色就可以了,比如角色rleA可以删除和编辑操作,roleB只能编辑,把这两个用户分别赋予A用户和B用户。
16 楼 solomon 2011-01-25  
  数据级的权限控制是怎么做的? 能交流下么?
15 楼 kyfxbl 2011-01-25  
不给力,粒度太粗。比如A,B都能进入用户管理页面,但A能做删除和编辑操作,B只能编辑不能删除。

你这个模型实现不了。建议你参考一下RBAC模型
14 楼 lym6520 2011-01-24  
godymoon 写道
这个权限中的URL能把系统中的URL完全包含吗?还有对以查询字符串结尾的URL该如何处理?

是否包含系统的全部url取决于过滤器的配置,还有req.getServletPath()这个返回的是请求的部分URL,不会包含请求参数。
13 楼 lym6520 2011-01-24  
真liuyake 写道
权限关联表里存的是什么?跟其他两个表有什么关联呀?说清楚点?

从表的结构中应该可以很容易看出来的,权限关联表维护角色和和菜单管理、权限表之间的关系,也就死对应的角色权限。
12 楼 lym6520 2011-01-24  
ltian 写道
楼主写着东为了让人赞扬获取快感和自信还是要让人批判从而提高自己呢?

不管是批评还是赞扬,只想自己能够做的更好。
11 楼 huangfoxAgain 2011-01-24  
貌似不能控制到数据!
10 楼 真liuyake 2011-01-24  
权限关联表里存的是什么?跟其他两个表有什么关联呀?说清楚点?
9 楼 godymoon 2011-01-24  
这个权限中的URL能把系统中的URL完全包含吗?还有对以查询字符串结尾的URL该如何处理?

相关推荐

    系统功能模块设计文档

    系统功能模块设计是软件开发过程中的关键环节,它定义了软件系统的核心操作和流程,确保系统能够满足用户需求并高效运行。在这个文档中,我们将深入探讨系统功能模块的设计原理、步骤以及常见模块类型。 首先,我们...

    图书馆管理系统小设计

    图书馆管理系统设计是一个复杂而关键的任务,旨在提升图书馆的工作效率和服务质量。该系统主要关注以下几个核心知识点: 1. **用户需求分析**: - **图书馆采编人员**需要快速查找和编目新书,简化工作流程,避免...

    系统功能模块图与设计

    ### 系统功能模块图与设计 #### 一、引言 随着信息技术的发展,企业级应用系统的构建变得越来越复杂。为了提高工作效率并更好地管理资源,许多机构选择开发专门的管理系统来辅助日常运营。本文将以“系统功能模块图...

    学生管理系统登录模块

    知识点1:系统设计目的 本系统的设计目的旨在减轻教师繁复的誊写工作、加强学校学生信息管理的方便性。同时也方便了老师与同学来查找或更改学生信息。 知识点2:系统功能简介 本系统包括学生信息注册管理、查询...

    一个简单实用的系统管理模块(权限管理模块)例子

    在IT行业中,权限管理和系统管理模块是构建任何大型或复杂应用程序不可或缺的部分。权限管理确保了用户只能访问他们被授权的功能和数据,而系统管理模块则提供了对整个系统的配置、监控和维护工具。以下是对这个“一...

    软件工程图书管理系统详细设计说明书

    流程图能直观地展示操作步骤,伪代码则可以预览程序的基本结构,而UML(统一建模语言)的类图和用例图则有助于理解系统间的交互和对象关系。 总的来说,这份详细设计说明书是软件开发过程中的重要文档,它为团队...

    高校设备管理系统设计【JSP,JAVA论文毕业设计,模块图,范文】

    模块图有助于团队理解系统的整体架构,方便后期的开发和维护。 在论文写作中,会详细讨论系统的需求分析、系统设计(包括数据库设计、界面设计、功能模块设计)、系统实现(编程语言的选择、开发工具的应用、具体...

    网上选课系统分析与设计(计算机本科毕业设计-UML建模)

    通过以上UML建模,网上选课系统的设计变得清晰明了,不仅有利于开发人员理解系统需求,也有助于团队协作和后期的维护与升级。这种严谨的分析与设计方法,是现代软件工程中不可或缺的一部分,确保了系统的质量和效率...

    图书管理系统采编模块的设计与实现设计说明.doc

    图书管理系统采编模块的设计与实现 本文档介绍了图书管理系统采编模块的设计与实现,旨在帮助学生理解图书管理系统的 采编模块的设计思路和实现方法。 一、图书管理系统概述 图书管理系统是指一种管理图书馆馆藏...

    考勤系统软件设计UML

    数据库设计是整个系统设计的重要组成部分。通过E-R图来表示实体之间的关系,有助于清晰地定义数据结构。考勤系统的核心实体包括员工、出勤记录、管理员、公告和部门。这些实体之间通过各种关联形成了复杂的数据网络...

    图书管理系统体系结构设计.pdf

    - **系统设置模块**:管理管理员、设置权限、管理书架和图书库存信息。 - **读者管理模块**:添加和删除读者,管理借书权限。 - **图书管理模块**:管理图书信息,包括类型、可借天数和库存。 - **图书查询模块*...

    权限设计(包括表结构)

    权限设计的主要组件包括权限管理模块、角色管理模块、用户管理模块和权限分配模块。权限管理模块负责管理所有的权限,包括功能权限和资源权限。角色管理模块负责管理所有的角色,包括管理员、普通用户等。用户管理...

    在线考试系统文档以及其用例图、模块图、时序图、实体类图

    在开发过程中,这些图将作为设计文档,协助团队成员沟通,确保所有人都对系统设计有共同的理解。 总结来说,"在线考试系统"的文档集合提供了设计此系统的全面视图,从用户的行为到系统的内部结构,再到各个组件的...

    客房信息管理系统包括需求概述 系统模块 数据流图

    数据流图是系统设计中的重要工具,用于描绘信息在系统中的流动过程。顶层图和0层图分别展示了系统整体和各个子系统的数据流,而图一和图二则进一步细化了具体的功能模块及其相互关系。通过这些图表,我们可以清晰地...

    办公自动化系统模块流程图

    以上各模块通过流程图的形式展示,有助于理解各个模块间的交互和数据流动,使企业管理者能够清晰地看到整个办公自动化系统的运作模式,从而进行更有效的管理和优化。在实际应用中,这些模块可以根据企业的具体需求...

    班级管理系统的数据库设计和数据流图.doc

    "班级管理系统数据库设计和数据流图" 班级管理系统的数据库设计和数据流图是基于高校班级管理系统的需求分析,旨在提供一个温馨、友好的操作界面,让大家进入系统感觉如同走进家庭般温暖。该系统主要实现以下基本...

    权限系统概要设计说明书

    以上设计将为权限管理系统提供坚实的基础,后续的详细设计将深入探讨这些模块的具体实现,包括接口设计、数据库表结构设计、错误处理机制和安全性考虑。整个系统的设计和实现将遵循软件工程的最佳实践,以确保系统的...

    用户权限管理模块(C++实现)

    在IT行业中,权限管理系统是软件应用中的重要组成部分,它用于控制不同用户对系统资源的访问。本项目"用户权限管理模块(C++实现)"是一个用C++编程语言实现的权限管理解决方案,它包含了几个核心功能,如单例模式、...

    OA系统权限管理设计方案

    ### OA系统权限管理设计方案解析 #### 一、权限管理概述 在现代企业信息化管理中,OA(Office Automation System,办公自动化系统)系统扮演着至关重要的角色。为了确保系统的高效运行和信息安全,合理设计权限...

Global site tag (gtag.js) - Google Analytics