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

在百度百科里查到了权限管理系统的定义:
[quote]权限管理,一般指根据系统设置的安全规则或者安全策略,用户可以访问而且只能访问自己被授权的资源,不多不少。权限管理几乎出现在任何系统里面,只要有用户和密码的系统。[/quote]
任何一个系统都有对应的权限管理模块,比较粗糙的系统是在开发的时候就定义了哪些类型的用户拥有某些权限,在开发过程中就把权限给定死了;有的则是通过模糊匹配url来进行权限的控制,但是这些日后维护起来会比较麻烦,可能还有其他很多种方式来进行权限的管理,但是不管通过何种方式,其目的都是为了能够安全、灵活、方便的操作,而且还不能影响系统性能。

以下是我自己开发的后台管理系统的权限模块,分享一下我设计的权限模块的开发思路:
后台管理系统是基于Spring + struts2.0 + hibernate + Ext 3.2.1架构开发的,因为前台主要是以Ext为主,所以权限模块也是在围绕Ext树进行设计的。使用Ext开发过的同学都知道Ext.tree.TreePanel的节点是由Ext.tree.TreeNode定义的,其中Ext.tree.TreeNode中有个href属性,接下来的权限控制就是围绕这个href进行控制的。
先来看看数据模型:
[img]http://dl.iteye.com/upload/attachment/402585/9142c246-0af6-317b-a5eb-2f1330d98c72.gif[/img]
从模型中可以看到权限表引用了菜单管理这张表,扩展这张权限表的目的是为了更灵活的对权限进行管理,而不单单只是围绕菜单树,然后通过权限关联表进行角色权限的维护。

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

接下来进入权限模块的开发阶段,系统是根据角色进行权限控制的,在用户登入系统的时候,获取用户的角色信息,然后获取角色的权限信息也就是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;
}
}

}


最后贴些图上来看看:

权限管理模块:
[img]http://dl.iteye.com/upload/attachment/402590/cedc0a7a-74c5-37ea-8589-ddba9db72f04.gif[/img]

接下来看下一普通用户的权限信息及登入界面:
普通用户权限信息(选中为已分配权限):
[img]http://dl.iteye.com/upload/attachment/402593/e9d622c6-f257-3a7e-9387-d96805284bb1.gif[/img]
普通用户登入界面:
[img]http://dl.iteye.com/upload/attachment/402600/9fbdfbeb-646d-3f3d-a80a-65b3cc589f75.gif[/img]

补充说明:
有些同学可能没看明白,认为权限粒度太粗,这里我特别说明一下:控制不当单只是用户入口(菜单)的控制,也包括了操作控制(即包含了权限过滤器指定下的所有URL)。完全可以控制到每一个操作。
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值