免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 1335 | 回复: 0
打印 上一主题 下一主题

Acegi安全系统的配置 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2009-01-15 11:35 |只看该作者 |倒序浏览
Acegi
的配置看起来非常复杂,但事实上在实际项目的安全应用中我们并不需要那么多功能,清楚的了解Acegi配置中各项的功能,有助于我们灵活的运用Acegi于实践中。
2.1 在Web.xml中的配置
1)  
FilterToBeanProxy
  Acegi通过实现了Filter接口的FilterToBeanProxy提供一种特殊的使用Servlet
Filter的方式,它委托Spring中的Bean --
FilterChainProxy来完成过滤功能,这好处是简化了web.xml的配置,并且充分利用了Spring
IOC的优势。FilterChainProxy包含了处理认证过程的filter列表,每个filter都有各自的功能。
   
        Acegi Filter Chain Proxy
        org.acegisecurity.util.FilterToBeanProxy
        
            targetClass
            org.acegisecurity.util.FilterChainProxy
        
   
2)
filter-mapping

  限定了FilterToBeanProxy的URL匹配模式,只有*.do和*.jsp和/j_acegi_security_check
的请求才会受到权限控制,对javascript,css等不限制。
   
      Acegi Filter Chain Proxy
      *.do
   
   
   
      Acegi Filter Chain Proxy
      *.jsp
   
   
   
      Acegi Filter Chain Proxy
      /j_acegi_security_check
   
3)
HttpSessionEventPublisher
  的HttpSessionEventPublisher用于发布
HttpSessionApplicationEvents和HttpSessionDestroyedEvent事件给spring的
applicationcontext。
   
        org.acegisecurity.ui.session.HttpSessionEventPublisher
   
2.2 在applicationContext-acegi-security.xml中
2.2.1 FILTER CHAIN
  FilterChainProxy会按顺序来调用这些filter,使这些filter能享用Spring ioc的功能,
CONVERT_URL_TO_LOWERCASE_BEFORE_COMPARISON定义了url比较前先转为小写,
PATTERN_TYPE_APACHE_ANT定义了使用Apache ant的匹配模式
   
        
            
                CONVERT_URL_TO_LOWERCASE_BEFORE_COMPARISON
                PATTERN_TYPE_APACHE_ANT
               /**=httpSessionContextIntegrationFilter,authenticationProcessingFilter,
basicProcessingFilter,rememberMeProcessingFilter,anonymousProcessingFilter,
exceptionTranslationFilter,filterInvocationInterceptor
            
        
   
2.2.2 基础认证
1)
authenticationManager
  起到认证管理的作用,它将验证的功能委托给多个Provider,并通过遍历Providers,
以保证获取不同来源的身份认证,若某个Provider能成功确认当前用户的身份,authenticate()方法会返回一个完整的包含用户授权信息的Authentication对象,否则会抛出一个AuthenticationException。
Acegi提供了不同的AuthenticationProvider的实现,如:
        
DaoAuthenticationProvider
从数据库中读取用户信息验证身份
        
AnonymousAuthenticationProvider
匿名用户身份认证
        
RememberMeAuthenticationProvider
已存cookie中的用户信息身份认证
        
AuthByAdapterProvider 使用容器的适配器验证身份
        
CasAuthenticationProvider 根据Yale中心认证服务验证身份,
用于实现单点登陆
        
JaasAuthenticationProvider
从JASS登陆配置中获取用户信息验证身份
        
RemoteAuthenticationProvider
根据远程服务验证用户身份
        
RunAsImplAuthenticationProvider
对身份已被管理器替换的用户进行验证
        
X509AuthenticationProvider
从X509认证中获取用户信息验证身份
        
TestingAuthenticationProvider 单元测试时使用
        
每个认证者会对自己指定的证明信息进行认证,如DaoAuthenticationProvider仅对UsernamePasswordAuthenticationToken这个证明信息进行认证。
        
            
               
               
               
            
        
2)
daoAuthenticationProvider
  进行简单的基于数据库的身份验证。
DaoAuthenticationProvider获取数据库中的账号密码并进行匹配,若成功则在通过用户身份的同时返回一个包含授权信息的
Authentication对象,否则身份验证失败,抛出一个AuthenticatiionException。
   
        
        
        
   
3) passwordEncoder

  使用加密器对用户输入的明文进行加密。Acegi提供了三种加密器:
PlaintextPasswordEncoder—默认,不加密,返回明文.
ShaPasswordEncoder—哈希算法(SHA)加密
Md5PasswordEncoder—消息摘要(MD5)加密
4) jdbcDaoImpl  
  用于在数据中获取用户信息。
acegi提供了用户及授权的表结构,但是您也可以自己来实现。通过usersByUsernameQuery这个SQL得到你的(用户ID,密码,状态信息);通过authoritiesByUsernameQuery这个SQL得到你的(用户ID,授权信息)

        
        
            
select loginid,passwd,1 from users where loginid =
?
        
        
            
select u.loginid,p.name from users u,roles r,permissions
p,user_role ur,role_permis rp where u.id=ur.user_id and r.id=ur.role_id and
p.id=rp.permis_id
and
               
r.id=rp.role_id and p.status='1' and
u.loginid=?
        
5) userCache &  resourceCache  
  缓存用户和资源相对应的权限信息。每当请求一个受保护资源时,daoAuthenticationProvider就会被调用以获取用户授权信息。如果每次都从数据库获取的话,那代价很高,对于不常改变的用户和资源信息来说,最好是把相关授权信息缓存起来。(详见
2.6.3 资源权限定义扩展

)
userCache提供了两种实现: NullUserCache和EhCacheBasedUserCache,
NullUserCache实际上就是不进行任何缓存,EhCacheBasedUserCache是使用Ehcache来实现缓功能。
   
        
        
   
   
        
      
   
        
        
   
   
        
   
6) basicProcessingFilter
  用于处理HTTP头的认证信息,如从Spring远程协议(如Hessian和Burlap)或普通的浏览器如IE,Navigator的
HTTP头中获取用户信息,将他们转交给通过authenticationManager属性装配的认证管理器。如果认证成功,会将一个
Authentication对象放到会话中,否则,如果认证失败,会将控制转交给认证入口点(通过authenticationEntryPoint属
性装配)
   
        
        
   
7) basicProcessingFilterEntryPoint
  通过向浏览器发送一个HTTP401(未授权)消息,提示用户登录。
处理基于HTTP的授权过程,
在当验证过程出现异常后的"去向",通常实现转向、在response里加入error信息等功能。

        
8) authenticationProcessingFilterEntryPoint
  当抛出AccessDeniedException时,将用户重定向到登录界面。属性loginFormUrl配置了一个登录表单的URL,
当需要用户登录时,authenticationProcessingFilterEntryPoint会将用户重定向到该URL

        
            
/security/login.jsp
        
        
  2.2.3 HTTP安全请求
1) httpSessionContextIntegrationFilter
  每次request前
HttpSessionContextIntegrationFilter从Session中获取Authentication对象,在request完后,
又把Authentication对象保存到Session中供下次request使用,此filter必须其他Acegi
filter前使用,使之能跨越多个请求。
   
        
        
            
               
            
        
2)
httpRequestAccessDecisionManager
  经过投票机制来决定是否可以访问某一
资源(URL或方法)。allowIfAllAbstainDecisions为false时如果有一个或以上的decisionVoters投票通过,
则授权通过。可选的决策机制有ConsensusBased和UnanimousBased
   
        
        
            
               
            
        
   
3)
roleVoter
  必须是以rolePrefix设定的value开头的权限才能进行投票,如AUTH_ ,
ROLE_
   
        
   
4)exceptionTranslationFilter
  异常转换过滤器,主要是处理AccessDeniedException和AuthenticationException,将给每个异常找到合适的"去向"
   
        
   
5) authenticationProcessingFilter
  和servlet
spec差不多,处理登陆请求.当身份验证成功时,AuthenticationProcessingFilter会在会话中放置一个Authentication对象,并且重定向到登录成功页面
         
authenticationFailureUrl定义登陆失败时转向的页面
         
defaultTargetUrl定义登陆成功时转向的页面
         
filterProcessesUrl定义登陆请求的页面
         
rememberMeServices用于在验证成功后添加cookie信息
   
        
        
            /security/login.jsp?login_error=1
        
        
            /admin/index.jsp
        
        
            /j_acegi_security_check
        
        
   
6)
filterInvocationInterceptor
  在执行转向url前检查
objectDefinitionSource中设定的用户权限信息。首先,objectDefinitionSource中定义了访问URL需要的属性
信息(这里的属性信息仅仅是标志,告诉accessDecisionManager要用哪些voter来投票)。然
后,authenticationManager掉用自己的provider来对用户的认证信息进行校验。最后,有投票者根据用户持有认证和访问url需
要的属性,调用自己的voter来投票,决定是否允许访问。
   
        
        
        
   
7)
filterDefinitionSource (详见 2.6.3
资源权限定义扩展)
  自定义DBFilterInvocationDefinitionSource从数据库和cache中读取保护资源及其需要的访问权限信息
        
        
        
2.2.4 方法调用安全控制
(详见
2.6.3 资源权限定义扩展
)
1) methodSecurityInterceptor
  在执行方法前进行拦截,检查用户权限信息
2)
methodDefinitionSource
  自定义MethodDefinitionSource从cache中读取权限
   
        
        
        
   
   
        
   
2.3 Jcaptcha验证码
采用
http://jcaptcha.sourceforge.net
作为通用的验证码方案,请参考SpringSide中的例子,或网上的:
http://www.coachthrasher.com/page/blog?entry=jcaptcha_with_appfuse

差沙在此过程中又发现acegi logout filter的错误,进行了修正。
另外它默认提供的图片比较难认,我们custom了一个美观一点的版本。
               
               
               

本文来自ChinaUnix博客,如果查看原文请点:http://blog.chinaunix.net/u2/85344/showart_1797959.html
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP