知识大全 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] 以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!
浅谈Acegi配置-Spring-Java[3] 以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!
浅谈Acegi配置-Spring-Java[6] 以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!
浅谈Acegi配置-Spring-Java[5] 以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!im
浅谈Acegi配置-Spring-Java[2] 以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!&l
教你如何配置安全的SOLARIS系统 以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧! 一帐号和口令
启动Windows系统时,要想直接进入最小系统配置的安全模式,按__
启动Windows系统时,要想直接进入最小系统配置的安全模式,按_____。A、F7键B、F8键C、F9键D、F10键答案:B解析:开机时按F8键可进入安全模式。故选B。
知识大全 安全模式进不去系统,最后一次正确配置也不进不去系统,怎么整。
windowsupdate更新失败!安全模式进不去系统,最后一次正确配置也不进不去系统,怎么整。方案一:重启电脑,按住F8,要进入能够显示“最后一次正确配置的系统”的安全模式下,华硕主板的单按F8与多
知识大全 配置windows update失败 还原更改请勿关闭计算机,安全模式也进不去怎么办
配置windowsupdate失败还原更改请勿关闭计算机,安全模式也进不去怎么办那试试重启后按f8进入系统高级菜单选择用“最后一次正确配置”进入系统看看。进不去系统,一般是系统文件被损坏,要重装系统。
JavaBean安全新手段:JSF与Acegi联合 以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!