读书人

系统权限模块设计(ps:有图有实情!)

发布时间: 2012-08-22 09:50:35 作者: rapoo

系统权限模块设计(ps:有图有真相!)
在百度百科里查到了权限管理系统的定义:

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

在找百度百科看看权限管理的分类
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");//Extresp.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 requestExt.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)。完全可以控制到每一个操作。 怎么不能做呢?我只要分配两个角色就可以了,比如角色rleA可以删除和编辑操作,roleB只能编辑,把这两个用户分别赋予A用户和B用户。 怎么不能做呢?我只要分配两个角色就可以了,比如角色rleA可以删除和编辑操作,roleB只能编辑,把这两个用户分别赋予A用户和B用户。

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

RBAC1级的模型,URL和操作都是分离的,然后URL还有树形级联关系。RBAC2,3级模型就更复杂了,不过对于一般的场景,1级的模型已经够用了。你这个模型,0级都算不上。 怎么不能做呢?我只要分配两个角色就可以了,比如角色rleA可以删除和编辑操作,roleB只能编辑,把这两个用户分别赋予A用户和B用户。

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

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


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

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

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

你可能误解了,菜单管理和权限表本质是一样的,你可以把它当做一张表。比如你可以不分配菜单给用户,但是菜单下的操作功能你可以分配给用户,只是用户有这个操作功能,没有提供用户操作入口而已。

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

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

此模型只是级别1的RBAC。而且用户与角色是多对多的关系是级别1的RBAC的核心。您的设计,和RBAC大相径庭,我的砖拍重了,但是是实话。你的设计,与RBAC相差十万八千里。 28 楼 tanwencan 2011-03-14 求extjs书。

读书人网 >软件架构设计

热点推荐