本站首页    管理页面    写新日志    退出


«October 2025»
1234
567891011
12131415161718
19202122232425
262728293031


公告
本博客在此声明所有文章均为转摘,只做资料收集使用。并无其他商业用途。

我的分类(专题)

日志更新

最新评论

留言板

链接

Blog信息
blog名称:
日志总数:210
评论数量:205
留言数量:-19
访问次数:924437
建立时间:2007年5月10日




[acegi权限认证]Acegi+hibernate 动态实现基于角色的权限管理(2)
文章收藏,  网上资源,  软件技术,  电脑与网络

李小白 发表于 2007/7/19 16:44:20

lhwork 发表于 2006-6-13 11:32:58 解决方法: 1: 开发基于数据库的保护资源。 看过acegi的源代码就会知道,对保护资源的定义是通过实现ObjectDefinitionSource这个接口来实现的,而且acegi为我们提供了默认实现的抽象类 500)this.width=500'>500)this.width=500" align=top border=0>public abstract class AbstractMethodDefinitionSource 500)this.width=500'>500)this.width=500" align=top border=0>500)this.width=500'>500)this.width=500" align=top border=0>    implements MethodDefinitionSource 500)this.width=500'>500)this.width=500" border=0>{ 500)this.width=500'>500)this.width=500" align=top border=0>    //~ Static fields/initializers ============================================= 500)this.width=500'>500)this.width=500" align=top border=0>500)this.width=500'>500)this.width=500" align=top border=0>    private static final Log logger = LogFactory.getLog(AbstractMethodDefinitionSource.class); 500)this.width=500'>500)this.width=500" align=top border=0>500)this.width=500'>500)this.width=500" align=top border=0>    //~ Methods ================================================================ 500)this.width=500'>500)this.width=500" align=top border=0>500)this.width=500'>500)this.width=500" align=top border=0>    public ConfigAttributeDefinition getAttributes(Object object) 500)this.width=500'>500)this.width=500" align=top border=0>500)this.width=500'>500)this.width=500" align=top border=0>        throws IllegalArgumentException 500)this.width=500'>500)this.width=500" border=0>{ 500)this.width=500'>500)this.width=500" align=top border=0>        Assert.notNull(object, "Object cannot be null"); 500)this.width=500'>500)this.width=500" align=top border=0>500)this.width=500'>500)this.width=500" align=top border=0>500)this.width=500'>500)this.width=500" align=top border=0>        if (object instanceof MethodInvocation) 500)this.width=500'>500)this.width=500" border=0>{ 500)this.width=500'>500)this.width=500" align=top border=0>            return this.lookupAttributes(((MethodInvocation) object).getMethod()); 500)this.width=500'>500)this.width=500" align=top border=0>        } 500)this.width=500'>500)this.width=500" align=top border=0>500)this.width=500'>500)this.width=500" align=top border=0>500)this.width=500'>500)this.width=500" align=top border=0>        if (object instanceof JoinPoint) 500)this.width=500'>500)this.width=500" border=0>{ 500)this.width=500'>500)this.width=500" align=top border=0>            JoinPoint jp = (JoinPoint) object; 500)this.width=500'>500)this.width=500" align=top border=0>            Class targetClazz = jp.getTarget().getClass(); 500)this.width=500'>500)this.width=500" align=top border=0>            String targetMethodName = jp.getStaticPart().getSignature().getName(); 500)this.width=500'>500)this.width=500" align=top border=0>            Class[] types = ((CodeSignature) jp.getStaticPart().getSignature()) 500)this.width=500'>500)this.width=500" align=top border=0>                    .getParameterTypes(); 500)this.width=500'>500)this.width=500" align=top border=0>500)this.width=500'>500)this.width=500" align=top border=0>500)this.width=500'>500)this.width=500" align=top border=0>            if (logger.isDebugEnabled()) 500)this.width=500'>500)this.width=500" border=0>{ 500)this.width=500'>500)this.width=500" align=top border=0>                logger.debug("Target Class: " + targetClazz); 500)this.width=500'>500)this.width=500" align=top border=0>                logger.debug("Target Method Name: " + targetMethodName); 500)this.width=500'>500)this.width=500" align=top border=0>500)this.width=500'>500)this.width=500" align=top border=0>500)this.width=500'>500)this.width=500" align=top border=0>                for (int i = 0; i < types.length; i++) 500)this.width=500'>500)this.width=500" border=0>{ 500)this.width=500'>500)this.width=500" align=top border=0>500)this.width=500'>500)this.width=500" align=top border=0>                    if (logger.isDebugEnabled()) 500)this.width=500'>500)this.width=500" border=0>{ 500)this.width=500'>500)this.width=500" align=top border=0>                        logger.debug("Target Method Arg #" + i + ": " 500)this.width=500'>500)this.width=500" align=top border=0>                                + types[i]); 500)this.width=500'>500)this.width=500" align=top border=0>                    } 500)this.width=500'>500)this.width=500" align=top border=0>                } 500)this.width=500'>500)this.width=500" align=top border=0>            } 500)this.width=500'>500)this.width=500" align=top border=0>500)this.width=500'>500)this.width=500" align=top border=0>500)this.width=500'>500)this.width=500" align=top border=0>            try 500)this.width=500'>500)this.width=500" border=0>{ 500)this.width=500'>500)this.width=500" align=top border=0>                return this.lookupAttributes(targetClazz.getMethod(targetMethodName, types)); 500)this.width=500'>500)this.width=500" align=top border=0>500)this.width=500'>500)this.width=500" align=top border=0>            } catch (NoSuchMethodException nsme) 500)this.width=500'>500)this.width=500" border=0>{ 500)this.width=500'>500)this.width=500" align=top border=0>                throw new IllegalArgumentException("Could not obtain target method from JoinPoint: " + jp); 500)this.width=500'>500)this.width=500" align=top border=0>            } 500)this.width=500'>500)this.width=500" align=top border=0>        } 500)this.width=500'>500)this.width=500" align=top border=0>500)this.width=500'>500)this.width=500" align=top border=0>        throw new IllegalArgumentException("Object must be a MethodInvocation or JoinPoint"); 500)this.width=500'>500)this.width=500" align=top border=0>    } 500)this.width=500'>500)this.width=500" align=top border=0>500)this.width=500'>500)this.width=500" align=top border=0>500)this.width=500'>500)this.width=500" align=top border=0>    public boolean supports(Class clazz) 500)this.width=500'>500)this.width=500" border=0>{ 500)this.width=500'>500)this.width=500" align=top border=0>        return (MethodInvocation.class.isAssignableFrom(clazz) 500)this.width=500'>500)this.width=500" align=top border=0>        || JoinPoint.class.isAssignableFrom(clazz)); 500)this.width=500'>500)this.width=500" align=top border=0>    } 500)this.width=500'>500)this.width=500" align=top border=0>500)this.width=500'>500)this.width=500" align=top border=0>500)this.width=500'>500)this.width=500" align=top border=0>    protected abstract ConfigAttributeDefinition lookupAttributes(Method method); 500)this.width=500'>500)this.width=500" align=top border=0>} 500)this.width=500'>500)this.width=500" align=top border=0>我们要做的就是实现它的 protected abstract ConfigAttributeDefinition lookupAttributes(Method method);方法, 以下是我的实现方法,大致思路是这样,通过由抽象类传来的Method 对象得到 调用这个方法的 包名,类名,方法名 也就是secureObjectName, 查询数据库并将结果映射为Function 也就是secureObject ,由于Function 与 Role 的多对多关系 可以得到 Function所对应的 Roles ,在将role 包装成GrantedAuthority (也就是acegi中的角色)。其中由于频繁的对数据库的查询 所以使用Ehcache 来作为缓存。   1 package sample.auth;   2   3 import java.lang.reflect.Method;   4 import java.util.ArrayList;   5 import java.util.Arrays;   6 import java.util.Collection;   7 import java.util.Iterator;   8 import java.util.List;   9 import java.util.Set;  10  11 import org.acegisecurity.ConfigAttributeDefinition;  12 import org.acegisecurity.ConfigAttributeEditor;  13 import org.acegisecurity.GrantedAuthority;  14 import org.acegisecurity.GrantedAuthorityImpl;  15 import org.acegisecurity.intercept.method.AbstractMethodDefinitionSource;  16 import org.springframework.util.Assert;  17  18 import sample.auth.cache.AuthorityBasedFunctionCache;  19 import sample.auth.cache.info.FunctionByNameCache;  20 import sample.dao.IBaseDao;  21 import sample.mappings.function.Function;  22 import sample.mappings.role.Role;  23  24 public class DatabaseDrivenMethodDefinitionSourcew extends  25                 AbstractMethodDefinitionSource {  26          27         // baseDao 提供通过HIbenate对数据库操作的实现  28         private IBaseDao baseDao;  29         // AuthorityBasedFunctionCache 通过Function 查 Role 时缓存  30         private AuthorityBasedFunctionCache cache;  31         // FunctionByNameCache 由反射到的方法名查找 数据库对应的Function 时的缓存  32         private FunctionByNameC


阅读全文(5031) | 回复(2) | 编辑 | 精华
 


回复:Acegi+hibernate 动态实现基于角色的权限管理(2)
文章收藏,  网上资源,  软件技术,  电脑与网络

参数(游客)发表评论于2010/12/15 11:53:57

copy来的吧,汗,也贴好点啊!


个人主页 | 引用回复 | 主人回复 | 返回 | 编辑 | 删除
 


回复:Acegi+hibernate 动态实现基于角色的权限管理(2)
文章收藏,  网上资源,  软件技术,  电脑与网络

老卢(游客)发表评论于2008/7/28 15:47:05

代码不全。如何实现写的具体些。

个人主页 | 引用回复 | 主人回复 | 返回 | 编辑 | 删除
 


» 1 »

发表评论:
昵称:
密码:
主页:
标题:
验证码:  (不区分大小写,请仔细填写,输错需重写评论内容!)



站点首页 | 联系我们 | 博客注册 | 博客登陆

Sponsored By W3CHINA
W3CHINA Blog 0.8 Processed in 0.590 second(s), page refreshed 144798366 times.
《全国人大常委会关于维护互联网安全的决定》  《计算机信息网络国际联网安全保护管理办法》
苏ICP备05006046号