`
zuiyanwangyue
  • 浏览: 164981 次
  • 性别: Icon_minigender_1
  • 来自: 河北
社区版块
存档分类
最新评论

Acegi的基本概念和原理

阅读更多

RBAC:Role Based Access Control 基于角色的安全控制,Acegi正是基于角色实现权限控制的。角色是一种抽象的逻辑用户分组,代表具有同等权限的用户组,资源和角色相关联,每个用户根据自己具有的角色获得相应的权限,这样就大大简化了授权的逻辑。

Acegi是一个基于Spring开发的安全框架,提供了非常有用的外置式的安全架构。它对web页面的安全保护是通过Filter(过滤器)来实现的,而对业务逻辑组件的方法级别的保护则是通过AOP实现的。

Acegi中有Principal(主体)和Credentials(证书)的概念,它们可以是任意对象,并且由Authentication对象封装,代表一个用户认证,其中Principal通常是用户名,Credentials通常是口令,不过在Acegi中通常将UserDetails作为Principal,除了存储用户名之外,UserDetails还包含了用户角色等权限信息。

org.acegisecurity.Authentication extends java.security.Principal Principal表示主体的抽象概念,它可以用来表示任何实体,例如个人或者公司等等。而Authentication扩展自Principal,表示一次验证请求,一个Authentication在被AuthenticationManager(认证管理器)处理之前被认为是没用通过验证的。

org.acegisecurity.AuthenticationManager 认证管理器,它的任务是对用户进行认证,其手段是通过识别Principal和Credentials来确定用户的身份,一般使用它的实现类ProviderManager处理验证请求。ProviderManager并不直接验证用户提供的Principal和Credentials,而是将他们委托给一个或者多个AuthenticationProvider来验证,只要有一个AuthenticationProvider成功认证了用户,认证过程就结束。

org.acegisecurity.GrantedAuthority 被赋予Authentication的已被认可的权限,GrantedAuthority必须或者能够把自己描述成字符串,或者能够被AccessDecisionManager(决策管理器)明确支持。

身份认证是Acegi安全保护机制的第一步,在用户通过了身份认证后,Acegi必须决定是否允许用户访问某一受保护的资源,这是由org.acegisecurity.AccessDecisionManager(决策管理器)完成的。它的职责是决定是否允许用户访问某一受保护的资源,其decide方法不抛出异常即认为允许访问。

决策管理器的决策过程相当有趣,它基于投票的方式,让一个或者多个具有投票权的AccessDecisionVoter对象进行投票,然后依据投票的结果判断是否允许访问该资源,具体策略依赖于实现,见AffirmativeBased、ConsensusBased、UnanimouseBased。

配置FilterChain,正确配置AuthenticationManager与AccessDecisionManager后,还需要配置一个过滤器链,让每一个过滤器各司其职,完成认证和授权,这也是最为复杂的一步。

常用过滤器简介:

1、ChannelProcessingFilter,确保当前URL以指定的协议进行访问,例如:必须对以secure开头的URL以HTTPS访问。

2、ConcurrentSessionFilter,阻止同一用户在某段时间内多次登录。

3、HttpSessionContextIntegrationFilter,由于用户的认证信息放在HttpSession中,这个过滤器的作用就是从Session中获得用户的认证信息,然后将其关联到当前请求中,如果没有这个过滤器,后续的请求处理就无法获得已认证的用户身份信息。任何需要访问SecurityContextHolder的Filter都必须放在HttpSessionContextIntegrationFilter之后,否则获取的Authentication对象将永远是null。

另外还有LogouFilter、AuthenticationProcessingFilter、SecurityContextHolderAwareRequestFilter、RememberMeProcessingFilter、AnonymousProcessingFilter、ExceptionTranslationFilter、FilterSecurityInterceptor等,它们的具体功能在此不一一详述,可参见Acegi的Javadoc或者相关资料。

注意:Filter的顺序非常重要,因为有的Filter依赖于其它的Filter,总的来说,Filter的顺序应该严格按照上述介绍的顺序排列,但是可以有选择性的使用。

需要特别指出的是最后一个Filter,即FilterSecurityInterceptor,因为真正保护Web资源的正是这个Filter,它通过将URL和相应的角色关联起来,再使用AccessDecisionManager就实现了资源的授权访问。

Acegi的配置看起来很复杂,实际上整个安全管理器框架主要由FilterChainProxy(过滤器链代理)、AuthenticationManager(认证管理器)、AccessDecisionManager(决策管理器)三大组件组成,它们各司其职,配合完成整个安全模块。

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics