知识大全 Acegi安全系统的配置

Posted 信息

篇首语:你既认准这条路,又何必在意要走多久。本文由小常识网(cha138.com)小编为大家整理,主要介绍了知识大全 Acegi安全系统的配置相关的知识,希望对你有一定的参考价值。

Acegi安全系统的配置  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!

           Acegi 的配置看起来非常复杂 但事实上在实际项目的安全应用中我们并不需要那么多功能 清楚的了解Acegi配置中各项的功能 有助于我们灵活的运用Acegi于实践中

   在Web xml中的配置

   )  FilterToBeanProxy  Acegi通过实现了Filter接口的FilterToBeanProxy提供一种特殊的使用Servlet Filter的方式 它委托Spring中的Bean FilterChainProxy来完成过滤功能 这好处是简化了web xml的配置 并且充分利用了Spring IOC的优势 FilterChainProxy包含了处理认证过程的filter列表 每个filter都有各自的功能

  <filter>        <filter name>Acegi Filter Chain Proxy</filter name>        <filter class> acegisecurity util FilterToBeanProxy</filter class>        <init param>            <param name>targetClass</param name>            <param value> acegisecurity util FilterChainProxy</param value>        </init param>    </filter>

   ) filter mapping  <filter mapping>限定了FilterToBeanProxy的URL匹配模式 只有* do和* jsp和/j_acegi_security_check 的请求才会受到权限控制 对javascript css等不限制

  <filter mapping>      <filter name>Acegi Filter Chain Proxy</filter name>      <url pattern>* do</url pattern>    </filter mapping>        <filter mapping>      <filter name>Acegi Filter Chain Proxy</filter name>      <url pattern>* jsp</url pattern>    </filter mapping>        <filter mapping>      <filter name>Acegi Filter Chain Proxy</filter name>      <url pattern>/j_acegi_security_check</url pattern> </filter mapping>

   ) HttpSessionEventPublisher  <listener>的HttpSessionEventPublisher用于发布HttpSessionApplicationEvents和HttpSessionDestroyedEvent事件给spring的applicationcontext

  <listener><listener class> acegisecurity ui session HttpSessionEventPublisher</listener class>    </listener>

在applicationContext acegi security xml中

FILTER CHAIN

  FilterChainProxy会按顺序来调用这些filter 使这些filter能享用Spring ioc的功能 CONVERT_URL_TO_LOWERCASE_BEFORE_PARISON定义了url比较前先转为小写 PATTERN_TYPE_APACHE_ANT定义了使用Apache ant的匹配模式

  <bean id= filterChainProxy class= acegisecurity util FilterChainProxy >        <property name= filterInvocationDefinitionSource >            <value>                CONVERT_URL_TO_LOWERCASE_BEFORE_PARISON                PATTERN_TYPE_APACHE_ANT               /**=SessionContextIntegrationFilter authenticationProcessingFilter basicProcessingFilter rememberMeProcessingFilter anonymousProcessingFilter exceptionTranslationFilter filterInvocationInterceptor            </value>        </property>    </bean>

基础认证

   ) authenticationManager  起到认证管理的作用 它将验证的功能委托给多个Provider 并通过遍历Providers 以保证获取不同来源的身份认证 若某个Provider能成功确认当前用户的身份 authenticate()方法会返回一个完整的包含用户授权信息的Authentication对象 否则会抛出一个AuthenticationException Acegi提供了不同的AuthenticationProvider的实现 如         DaoAuthenticationProvider 从数据库中读取用户信息验证身份        AnonymousAuthenticationProvider 匿名用户身份认证        RememberMeAuthenticationProvider 已存cookie中的用户信息身份认证        AuthByAdapterProvider 使用容器的适配器验证身份        CasAuthenticationProvider 根据Yale中心认证服务验证身份 用于实现单点登陆        JaasAuthenticationProvider 从JASS登陆配置中获取用户信息验证身份        RemoteAuthenticationProvider 根据远程服务验证用户身份        RunAsImplAuthenticationProvider 对身份已被管理器替换的用户进行验证        X AuthenticationProvider 从X 认证中获取用户信息验证身份        TestingAuthenticationProvider 单元测试时使用

  每个认证者会对自己指定的证明信息进行认证 如DaoAuthenticationProvider仅对UsernamePasswordAuthenticationToken这个证明信息进行认证

  <bean id= authenticationManager class= acegisecurity providers ProviderManager >        <property name= providers >            <list>                <ref local= daoAuthenticationProvider />                <ref local= anonymousAuthenticationProvider />                <ref local= rememberMeAuthenticationProvider />            </list>        </property></bean>

   ) daoAuthenticationProvider  进行简单的基于数据库的身份验证 DaoAuthenticationProvider获取数据库中的账号密码并进行匹配 若成功则在通过用户身份的同时返回一个包含授权信息的Authentication对象 否则身份验证失败 抛出一个AuthenticatiionException

  <bean id= daoAuthenticationProvider class= acegisecurity providers dao DaoAuthenticationProvider >        <property name= userDetailsService ref= jdbcDaoImpl />        <property name= userCache ref= userCache />        <property name= passwordEncoder ref= passwordEncoder />   </bean>

   ) passwordEncoder   使用加密器对用户输入的明文进行加密 Acegi提供了三种加密器:PlaintextPasswordEncoder—默认 不加密 返回明文 ShaPasswordEncoder—哈希算法(SHA)加密Md PasswordEncoder—消息摘要(MD )加密

  <bean id= passwordEncoder class= acegisecurity providers encoding Md PasswordEncoder />

   ) jdbcDaoImpl   用于在数据中获取用户信息 acegi提供了用户及授权的表结构 但是您也可以自己来实现 通过usersByUsernameQuery这个SQL得到你的(用户ID 密码 状态信息);通过authoritiesByUsernameQuery这个SQL得到你的(用户ID 授权信息)

  <bean id= jdbcDaoImpl class= acegisecurity userdetails jdbc JdbcDaoImpl >        <property name= dataSource ref= dataSource />        <property name= usersByUsernameQuery >            <value>select loginid passwd from users where loginid = ?</value>        </property>        <property name= authoritiesByUsernameQuery >            <value>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= and u loginid=?</value>        </property></bean>

   ) userCache &  resourceCache   缓存用户和资源相对应的权限信息 每当请求一个受保护资源时 daoAuthenticationProvider就会被调用以获取用户授权信息 如果每次都从数据库获取的话 那代价很高 对于不常改变的用户和资源信息来说 最好是把相关授权信息缓存起来 (详见 资源权限定义扩展 )userCache提供了两种实现: NullUserCache和EhCacheBasedUserCache NullUserCache实际上就是不进行任何缓存 EhCacheBasedUserCache是使用Ehcache来实现缓功能

  <bean id= userCacheBackend class= springframework cache ehcache EhCacheFactoryBean >        <property name= cacheManager ref= cacheManager />        <property name= cacheName value= userCache />    </bean>    <bean id= userCache class= acegisecurity providers dao cache EhCacheBasedUserCache autowire= byName >        <property name= cache ref= userCacheBackend />     </bean>    <bean id= resourceCacheBackend class= springframework cache ehcache EhCacheFactoryBean >        <property name= cacheManager ref= cacheManager />        <property name= cacheName value= resourceCache />    </bean>    <bean id= resourceCache class= springside modules security service acegi cache ResourceCache autowire= byName >        <property name= cache ref= resourceCacheBackend />    </bean>

   ) basicProcessingFilter   用于处理HTTP头的认证信息 如从Spring远程协议(如Hessian和Burlap)或普通的浏览器如IE Navigator的HTTP头中获取用户信息 将他们转交给通过authenticationManager属性装配的认证管理器 如果认证成功 会将一个Authentication对象放到会话中 否则 如果认证失败 会将控制转交给认证入口点(通过authenticationEntryPoint属性装配)

  <bean id= basicProcessingFilter class= acegisecurity ui basicauth BasicProcessingFilter >        <property name= authenticationManager ref= authenticationManager />        <property name= authenticationEntryPoint ref= basicProcessingFilterEntryPoint />    </bean>

   ) basicProcessingFilterEntryPoint   通过向浏览器发送一个HTTP (未授权)消息 提示用户登录 处理基于HTTP的授权过程 在当验证过程出现异常后的 去向 通常实现转向 在response里加入error信息等功能

  <bean id= basicProcessingFilterEntryPoint class= acegisecurity ui basicauth BasicProcessingFilterEntryPoint >        <property name= realmName value= SpringSide Realm /></bean>

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

  <bean id= authenticationProcessingFilterEntryPoint class= acegisecurity ui webapp AuthenticationProcessingFilterEntryPoint >        <property name= loginFormUrl >            <value>/security/login jsp</value>        </property>        <property name= forceHttps value= false /></bean>

HTTP安全请求

   ) SessionContextIntegrationFilter  每次request前 HttpSessionContextIntegrationFilter从Session中获取Authentication对象 在request完后 又把Authentication对象保存到Session中供下次request使用 此filter必须其他Acegi filter前使用 使之能跨越多个请求

  <bean id= SessionContextIntegrationFilter class= ontext HttpSessionContextIntegrationFilter ></bean>    <bean id= RequestAccessDecisionManager class= acegisecurity vote AffirmativeBased >        <property name= allowIfAllAbstainDecisions value= false />        <property name= decisionVoters >            <list>                <ref bean= roleVoter />            </list>        </property></bean>

   ) RequestAccessDecisionManager  经过投票机制来决定是否可以访问某一资源(URL或方法) allowIfAllAbstainDecisions为false时如果有一个或以上的decisionVoters投票通过 则授权通过 可选的决策机制有ConsensusBased和UnanimousBased

  <bean id= RequestAccessDecisionManager class= acegisecurity vote AffirmativeBased >        <property name= allowIfAllAbstainDecisions value= false />        <property name= decisionVoters >            <list>                <ref bean= roleVoter />            </list>        </property>    </bean>

   ) roleVoter   必须是以rolePrefix设定的value开头的权限才能进行投票 如AUTH_ ROLE_

  <bean id= roleVoter class= acegisecurity vote RoleVoter >        <property name= rolePrefix value= AUTH_ />   </bean>

   )exceptionTranslationFilter  异常转换过滤器 主要是处理AccessDeniedException和AuthenticationException 将给每个异常找到合适的 去向  

  <bean id= exceptionTranslationFilter class= acegisecurity ui ExceptionTranslationFilter >        <property name= authenticationEntryPoint ref= authenticationProcessingFilterEntryPoint />    </bean>

   ) authenticationProcessingFilter  和servlet spec差不多 处理登陆请求 当身份验证成功时 AuthenticationProcessingFilter会在会话中放置一个Authentication对象 并且重定向到登录成功页面         authenticationFailureUrl定义登陆失败时转向的页面         defaultTargetUrl定义登陆成功时转向的页面         filterProcessesUrl定义登陆请求的页面         rememberMeServices用于在验证成功后添加cookie信息

  <bean id= authenticationProcessingFilter class= acegisecurity ui webapp AuthenticationProcessingFilter >        <property name= authenticationManager ref= authenticationManager />        <property name= authenticationFailureUrl >            <value>/security/login jsp?login_error= </value>        </property>        <property name= defaultTargetUrl >            <value>/admin/index jsp</value>        </property>        <property name= filterProcessesUrl >            <value>/j_acegi_security_check</value>        </property>        <property name= rememberMeServices ref= rememberMeServices />    </bean>

   ) filterInvocationInterceptor  在执行转向url前检查objectDefinitionSource中设定的用户权限信息 首先 objectDefinitionSource中定义了访问URL需要的属性信息(这里的属性信息仅仅是标志 告诉accessDecisionManager要用哪些voter来投票) 然后 authenticationManager掉用自己的provider来对用户的认证信息进行校验 最后 有投票者根据用户持有认证和访问url需要的属性 调用自己的voter来投票 决定是否允许访问

  <bean id= filterInvocationInterceptor class= acegisecurity intercept web FilterSecurityInterceptor >        <property name= authenticationManager ref= authenticationManager />        <property name= accessDecisionManager ref= RequestAccessDecisionManager />        <property name= objectDefinitionSource ref= filterDefinitionSource />    </bean>

   ) filterDefinitionSource (详见 资源权限定义扩展)  自定义DBFilterInvocationDefinitionSource从数据库和cache中读取保护资源及其需要的访问权限信息 

  <bean id= filterDefinitionSource class= springside modules security service acegi DBFilterInvocationDefinitionSource >        <property name= convertUrlToLowercaseBeforeComparison value= true />        <property name= useAntPath value= true />        <property name= acegiCacheManager ref= acegiCacheManager /></bean>

方法调用安全控制

  (详见 资源权限定义扩展)

   ) methodSecurityInterceptor  在执行方法前进行拦截 检查用户权限信息 ) methodDefinitionSource  自定义MethodDefinitionSource从cache中读取权限

  <bean id= methodSecurityInterceptor class= acegisethod aopalliance MethodSecurityInterceptor >        <property name= authenticationManager ref= authenticationManager />        <property name= accessDecisionManager ref= RequestAccessDecisionManager />        <property name= objectDefinitionSource ref= methodDefinitionSource />    </bean>    <bean id= methodDefinitionSource class= springside modules security service acegi DBMethodDefinitionSource >        <property name= acegiCacheManager ref= acegiCacheManager />    </bean>

Jcaptcha验证码

  采用 ;作为通用的验证码方案 请参考SpringSide中的例子 或网上的 _with_appfuse

  差沙在此过程中又发现acegi logout filter的错误 进行了修正

cha138/Article/program/net/201311/13798

相关参考

知识大全 浅谈Acegi配置-Spring-Java[4]

浅谈Acegi配置-Spring-Java[4]  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!  

知识大全 浅谈Acegi配置-Spring-Java[3]

浅谈Acegi配置-Spring-Java[3]  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!  

知识大全 浅谈Acegi配置-Spring-Java[6]

浅谈Acegi配置-Spring-Java[6]  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!  

知识大全 浅谈Acegi配置-Spring-Java[5]

浅谈Acegi配置-Spring-Java[5]  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!im

知识大全 浅谈Acegi配置-Spring-Java[2]

浅谈Acegi配置-Spring-Java[2]  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!&l

知识大全 教你如何配置安全的SOLARIS系统

教你如何配置安全的SOLARIS系统  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!  一帐号和口令

启动Windows系统时,要想直接进入最小系统配置的安全模式,按__

启动Windows系统时,要想直接进入最小系统配置的安全模式,按_____。A、F7键B、F8键C、F9键D、F10键答案:B解析:开机时按F8键可进入安全模式。故选B。

知识大全 安全模式进不去系统,最后一次正确配置也不进不去系统,怎么整。

windowsupdate更新失败!安全模式进不去系统,最后一次正确配置也不进不去系统,怎么整。方案一:重启电脑,按住F8,要进入能够显示“最后一次正确配置的系统”的安全模式下,华硕主板的单按F8与多

知识大全 配置windows update失败 还原更改请勿关闭计算机,安全模式也进不去怎么办

配置windowsupdate失败还原更改请勿关闭计算机,安全模式也进不去怎么办那试试重启后按f8进入系统高级菜单选择用“最后一次正确配置”进入系统看看。进不去系统,一般是系统文件被损坏,要重装系统。

知识大全 JSF 与Acegi联合

JavaBean安全新手段:JSF与Acegi联合  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!