Spring(Acegi)Security 权限扩展方案及问题

最近研究Spring(Acegi)Security 的权限管理扩展方案,基本告一段落,总结下遇到的问题以及解决方案,方案参照了springside,但使用后发现居然有惊天大bug,很是头痛。
教程可以参见http://family168.com/oa/springsecurity/html/index.html第5章
问题1:例程的权限控制居然依赖于数据库的数据顺序
研究发现扩展代码对当同一url属于多个用户组时没有做处理,由于采用HashMap并且用url作为key,导致前面加载的被后面key相同的给覆盖了,改造代码如下,采用url相同叠加机制
protected Map<String, String> findResources() {
ResourceMapping resourceMapping = new ResourceMapping(getDataSource(),
resourceQuery);

Map<String, String> resourceMap = new LinkedHashMap<String, String>();

for (Resource resource : (List<Resource>) resourceMapping.execute()) {
String url = resource.getUrl();
String role = resource.getRole();

if (resourceMap.containsKey(url)) {
String value = resourceMap.get(url);
resourceMap.put(url, value + "," + role);
} else {
resourceMap.put(url, role);
}
}

return resourceMap;
}

protected LinkedHashMap<RequestKey, ConfigAttributeDefinition> buildRequestMap() {
LinkedHashMap<RequestKey, ConfigAttributeDefinition> requestMap = null;
requestMap = new LinkedHashMap<RequestKey, ConfigAttributeDefinition>();

ConfigAttributeEditor editor = new ConfigAttributeEditor();

Map<String, String> resourceMap = this.findResources();

for (Map.Entry<String, String> entry : resourceMap.entrySet()) {
RequestKey key = new RequestKey(entry.getKey(), null);
editor.setAsText(entry.getValue());
requestMap.put(key,
(ConfigAttributeDefinition) editor.getValue());
}

return requestMap;
}
问题解决

问题2:在问题1解决的基础上发现权限还是依赖于数据顺序,这个是spring Security机制的问题,比如a url是b url的子集,a url必须在b url之前加载,否则a url权限无效,这个解决方案和springside论坛上和他们开发组人员讨论了好久,他们给出的方案是设置一个优先级字段来解决,我觉得这种方案太夸张没有采纳,当url很多的时候手动设置优先级太夸张,管理员还要设置url的范围顺序是不太现实的,最后使用根据url字符排序再倒序,基本可以保证如果a url是b url的子集排列到b url之前,目前还没有想到特殊url
问题算是基本解决

问题3,自定义登陆界面在设置<intercept-url pattern="/login.jsp" access="IS_AUTHENTICATED_ANONYMOUSLY" />无法访问,其实就是个死循环,不停的刷,因为没有login.jsp的访问权限,失败了又转到login.jsp呵呵,没完没了了
其实这个设置压根就没起作用,因为被我们自己定义的filter给打劫了,所以还是把login.jsp设置为不使用filter拦截吧。虽然不拦截和拦截了给匿名用户权限是不一样的,但在这里是一样的效果
<intercept-url pattern="/login.jsp" filters="none"/>
<intercept-url pattern="/scripts/**" filters="none"/>
<intercept-url pattern="/images/**" filters="none"/>
<intercept-url pattern="/styles/**" filters="none"/>
问题解决
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值