Acegi将资源权限数据存储到数据库.docx
- 文档编号:2209130
- 上传时间:2022-10-27
- 格式:DOCX
- 页数:20
- 大小:194.71KB
Acegi将资源权限数据存储到数据库.docx
《Acegi将资源权限数据存储到数据库.docx》由会员分享,可在线阅读,更多相关《Acegi将资源权限数据存储到数据库.docx(20页珍藏版)》请在冰豆网上搜索。
Acegi将资源权限数据存储到数据库
夜阑犹翦灯花弄
赶项目--|回首页|2005年索引|--认识了一个叫丹丹的女孩
Acegi资源配置动态扩展实现--
1.问题提出
在使用AcegiSecurityFramework的过程中,如果细心的话,会发现其资源和角色配置是在配置文件中的,下面是Appfuse中相关配置:
class="net.sf.acegisecurity.intercept.web.FilterSecurityInterceptor">
CONVERT_URL_TO_LOWERCASE_BEFORE_COMPARISON
PATTERN_TYPE_APACHE_ANT
/signup.html=ROLE_ANONYMOUS,admin,tomcat
/passwordhint.html*=ROLE_ANONYMOUS,admin,tomcat
/**/*.html*=admin,tomcat
/clickstreams.jsp=admin
2.E-R模型
下图是需要的E-R模型
图1Acegi标准RBACE-R设计
图中的用户与角色不再多做解释,我们主要关注一下Permission表和Resource表,这里Resource表用于存储系统资源,在web层一般来说就是url,如果使用acl,就是aclClass,此时Permission表中的aclMask用来存储对应的acl权限,考虑到acl在web项目中使用率不高,下面我将着重介绍web层的权限控制,对acl有兴趣的读者可以自己参阅AcegiReferenceGuide.
3.如何阻止acegi从配置文件读取权限配置
从Appfuse中的示例性配置可以看出,acegi对权限配置的要求是“资源=角色1,角色2…角色n”,看过源代码的读者应该知道,最终这些配置将被组装为net.sf.acegisecurity.intercept.ObjectDefinitionSource(web层对应的实现是net.sf.acegisecurity.intercept.web.FilterInvocationDefinitionSource),那么我们怎么才能用数据库的数据来组装FilterInvocationDefinitionSource?
这里涉及到一个PropertyEditor问题,在Acegi中,FilterInvocationDefinitionSource是通过net.sf.acegisecurity.intercept.web.FilterInvocationDefinitionSourceEditor组装的,假如我们不想让FilterInvocationDefinitionSourceEditor从配置文件中读取权限配置,就需要自己实现一个ProdertyEditor来覆盖默认实现,下面是我的配置:
图2customerEditorConfigurer配置
那么,这个PropertyEditor中需要做些什么呢?
要做的就是使用一个比较特殊的标记,当遇到这个特殊标记的时候直接略过解析,我这里使用的标记是“DONT_USE_ME”,然后在PropertyEditor中简单的如下实现即可:
/*
*Copyright2004-2005wangz.
*Projectshufe_newsroom
*/
packagecom.skyon.um.security.acegi.intercept.web;
importjava.beans.PropertyEditorSupport;
importjava.io.BufferedReader;
importjava.io.IOException;
importjava.io.StringReader;
importnet.sf.acegisecurity.ConfigAttributeDefinition;
importnet.sf.acegisecurity.ConfigAttributeEditor;
importnet.sf.acegisecurity.intercept.web.FilterInvocationDefinitionMap;
importnet.sf.acegisecurity.intercept.web.PathBasedFilterInvocationDefinitionMap;
importnet.sf.acegisecurity.intercept.web.RegExpBasedFilterInvocationDefinitionMap;
importmons.lang.StringUtils;
importmons.logging.Log;
importmons.logging.LogFactory;
/**
*@since2005-8-4
*@author王政
*@version$Id:
FilterInvocationDefinitionSourceDynamicExtentionEditor.java,v1.22005/11/0415:
55:
07wangzhengExp$
*/
publicclassFilterInvocationDefinitionSourceDynamicExtentionEditorextends
PropertyEditorSupport{
publicstaticfinalStringANT_PATH_KEY="PATTERN_TYPE_APACHE_ANT";
publicstaticfinalStringLOWER_CASE_URL_KEY="CONVERT_URL_TO_LOWERCASE_BEFORE_COMPARISON";
publicstaticfinalStringDONT_USE_ME_KEY="DONT_USE_ME";
publicstaticfinalStringSTAND_DELIM_CHARACTER=",";
privatestaticfinalLoglogger=LogFactory.getLog(FilterInvocationDefinitionSourceDynamicExtentionEditor.class);
/**
*@seejava.beans.PropertyEditorSupport#setAsText(java.lang.String)
*/
publicvoidsetAsText(Stringtext)throwsIllegalArgumentException{
FilterInvocationDefinitionMapsource=newRegExpBasedFilterInvocationDefinitionMap();
if(StringUtils.isBlank(text)){
//Leavetargetobjectempty
}else{
//Checkifweneedtooverridethedefaultdefinitionmap
if(text.lastIndexOf(ANT_PATH_KEY)!
=-1){
source=newPathBasedFilterInvocationDefinitionMap();
if(logger.isDebugEnabled()){
logger.debug(("DetectedPATTERN_TYPE_APACHE_ANTdirective;usingApacheAntstylepathexpressions"));
}
}
if(text.lastIndexOf(LOWER_CASE_URL_KEY)!
=-1){
if(logger.isDebugEnabled()){
logger.debug("InstructingmappertoconvertURLstolowercasebeforecomparison");
}
source.setConvertUrlToLowercaseBeforeComparison(true);
}
if(text.indexOf(DONT_USE_ME_KEY)!
=-1){
if(logger.isDebugEnabled()){
logger.debug("DETECTED"+DONT_USE_ME_KEY+"directive; skipparse,Use"+EhCacheBasedFilterInvocationDefinitionSourceCache.class+"toparse!
");
}
addSecureUrl(source,"/dontuseme","dontuseme");
}else{
BufferedReaderbr=newBufferedReader(newStringReader(text));
intcounter=0;
Stringline;
while(true){
counter++;
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- Acegi 资源 权限 数据 存储 数据库