`
wang4674890
  • 浏览: 87603 次
  • 性别: Icon_minigender_2
  • 来自: 厦门
社区版块
存档分类
最新评论

Spring Security 基于数据库的权限管理配置

    博客分类:
  • java
 
阅读更多
目前在做一个原型系统,其中涉及到权限管理部分,研究了一下Spring Security,由于网上资料都是在配置文件里面定义url权限的,基本上没有存在数据库中的。在这个过程中我在网上找了很多资料,但是没有一个是完全能够解决问题的,acegi的例子springside倒是有一个。 而下面这段是一位网上朋友提供的,还不错,解析的清楚,大家可以参考
applicationContext-security.xml文件如下:
01.<?xml version="1.0" encoding="UTF-8"?>   
 02.<beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"  
 03.       xmlns:p="http://www.springframework.org/schema/p"  
 04.       xmlns:security="http://www.springframework.org/schema/security"  
 05.       xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd   
 06.        http://www.springframework.org/schema/security http://www.springframework.org/schema/security/spring-security-2.0.2.xsd">   
 07.  
 08.    <!--   
 09.            FilterChainProxy会按顺序来调用这些filter,使这些filter能享用Spring Ioc的功能,   
 10.            CONVERT_URL_TO_LOWERCASE_BEFORE_COMPARISON 定义url比较前先转为小写   
 11.            PATTERN_TYPE_APACHE_ANT 定义使用Apache ant的匹配模式   
 12.         -->   
 13.    <bean id="springSecurityFilterChain"  
 14.          class="org.springframework.security.util.FilterChainProxy">   
 15.        <property name="filterInvocationDefinitionSource">   
 16.            <value><![CDATA[   
 17.                    CONVERT_URL_TO_LOWERCASE_BEFORE_COMPARISON   
 18.                    PATTERN_TYPE_APACHE_ANT   
 19.                    /**=httpSessionContextIntegrationFilter,logoutFilter,authenticationProcessingFilter,securityContextHolderAwareRequestFilter,rememberMeProcessingFilter,anonymousProcessingFilter,exceptionTranslationFilter,filterSecurityInterceptor   
 20.                ]]></value>   
 21.        </property>   
 22.    </bean>   
 23.    <!--   
 24.        集成过滤器(HttpSessionContextIntegrationFilter是集成过滤器的一个实现)   
 25.           每次request前HttpSessionContextIntegrationFilter从Session中获取Authentication对象,在request完后   
 26.           又把Authentication对象保存到Session中供下次request使用,此filter必须在其他Acegi filter前使用   
 27.    -->   
 28.    <bean id="httpSessionContextIntegrationFilter"  
 29.          class="org.springframework.security.context.HttpSessionContextIntegrationFilter"/>   
 30.    <!--   
 31.        退出(Logout)过滤器 退出登录操作   
 32.    -->   
 33.    <bean id="logoutFilter"  
 34.          class="org.springframework.security.ui.logout.LogoutFilter">   
 35.        <!-- 退出系统后系统跳转到此URL -->   
 36.        <constructor-arg value="/login.action"/>   
 37.        <!-- 退出系统后的操作(调用logout方法) -->   
 38.        <constructor-arg>   
 39.            <list>   
 40.                <!-- 实现了LogoutHandler接口(logout方法) -->   
 41.                <ref bean="rememberMeServices"/>   
 42.                <bean class="org.springframework.security.ui.logout.SecurityContextLogoutHandler"/>   
 43.            </list>   
 44.        </constructor-arg>   
 45.    </bean>   
 46.    <!--   
 47.        处理表单认证filter:   
 48.        1.authenticationManager     认证管理器   
 49.        2.authenticationFailureUrl  定义登录失败时转向的页面   
 50.        3.defaultTargetUrl        定义登录成功时转向的页面   
 51.        4.filterProcessesUrl        定义登录请求的地址   
 52.        5.rememberMeServices        在验证成功后添加cookie信息   
 53.    -->   
 54.    <bean id="authenticationProcessingFilter"  
 55.          class="org.springframework.security.ui.webapp.AuthenticationProcessingFilter"  
 56.          p:authenticationManager-ref="authenticationManager"  
 57.          p:authenticationFailureUrl="/login.action?login_error=1"  
 58.          p:defaultTargetUrl="/user.action"  
 59.          p:filterProcessesUrl="/j_spring_security_check"  
 60.          p:rememberMeServices-ref="rememberMeServices"/>   
 61.    <!--   
 62.        认证管理器(org.springframework.security.AuthenticationManager接口)   
 63.         org.springframework.security.providers.ProviderManager是认证管理器的一个实现,   
 64.         ProviderManager通过遍历一个提供者的集合来实现身份验证,   
 65.         直到某一个认证提供者能够成功地验证该用户的身份   
 66.    -->   
 67.    <!--   
 68.        通过Providers提供认证者列表,如果一个认证提供者失败可以尝试另外一个认证提供者,以保证获取不同来源的身份认证,如   
 69.        DaoAuthenticationProvider        从数据库中读取用户信息验证身份   
 70.        AnonymousAuthenticationProvider  匿名用户身份认证   
 71.        RememberMeAuthenticationProvider 已存cookie中的用户信息身份认证   
 72.  
 73.        其它的还有   
 74.        AuthByAdapterProvider           使用容器的适配器验证身份   
 75.        CasAuthenticationProvider       根据Yale中心认证服务验证身份, 用于实现单点登陆   
 76.        JaasAuthenticationProvider      从JASS登陆配置中获取用户信息验证身份   
 77.        RemoteAuthenticationProvider    根据远程服务验证用户身份   
 78.        RunAsImplAuthenticationProvider 对身份已被管理器替换的用户进行验证   
 79.        X509AuthenticationProvider      从X509认证中获取用户信息验证身份   
 80.        TestingAuthenticationProvider   单元测试时使用   
 81.  
 82.        每个认证者会对自己指定的证明信息进行认证,如DaoAuthenticationProvider仅对UsernamePasswordAuthenticationToken这个证明信息进行认证。   
 83.    -->   
 84.    <bean id="authenticationManager"  
 85.          class="org.springframework.security.providers.ProviderManager"  
 86.          p:sessionController-ref="concurrentSessionController">   
 87.        <property name="providers">   
 88.            <list>   
 89.                <ref bean="daoAuthenticationProvider"/>   
 90.                <bean   
 91.                        class="org.springframework.security.providers.anonymous.AnonymousAuthenticationProvider"  
 92.                        p:key="springsecurity"/>   
 93.                <bean   
 94.                        class="org.springframework.security.providers.rememberme.RememberMeAuthenticationProvider"  
 95.                        p:key="springsecurity"/>   
 96.            </list>   
 97.        </property>   
 98.    </bean>   
 99.    <!-- 阻止用户在成功登录之后再进行一次成功登录 -->   
 100.    <bean id="concurrentSessionController"  
 101.          class="org.springframework.security.concurrent.ConcurrentSessionControllerImpl"  
 102.          p:maximumSessions="1"  
 103.          p:exceptionIfMaximumExceeded="true"  
 104.          p:sessionRegistry-ref="sessionRegistry"  
 105.          p:messageSource-ref="messageSource"/>   
 106.  
 107.    <bean id="sessionRegistry"  
 108.          class="org.springframework.security.concurrent.SessionRegistryImpl"/>   
 109.  
 110.    <bean id="messageSource"  
 111.          class="org.springframework.context.support.ReloadableResourceBundleMessageSource"  
 112.          p:basename="/WEB-INF/classes/messages_zh_CN"/>   
 113.  
 114.    <bean id="securityContextHolderAwareRequestFilter"  
 115.          class="org.springframework.security.wrapper.SecurityContextHolderAwareRequestFilter"/>   
 116.    <!--   
 117.       利用cookie自动登陆filter   
 118.        当SecurityContextHolder中不存在Authentication.用户授权信息,   
 119.        rememberMeProcessingFilter就会调用autoLogin()方法从cookie中获取用户信息,在验证filter之前使用   
 120.    -->   
 121.    <bean id="rememberMeProcessingFilter"  
 122.          class="org.springframework.security.ui.rememberme.RememberMeProcessingFilter"  
 123.          p:authenticationManager-ref="authenticationManager"  
 124.          p:rememberMeServices-ref="rememberMeServices"/>   
 125.    <!--   
 126.        如果不存在任何授权信息时,自动添加匿名用户身份至SecurityContextHolder中   
 127.    -->   
 128.    <bean id="anonymousProcessingFilter"  
 129.          class="org.springframework.security.providers.anonymous.AnonymousProcessingFilter"  
 130.          p:key="springsecurity"  
 131.          p:userAttribute="anonymousUser,ROLE_ANONYMOUS"/>   
 132.    <!--   
 133.       异常处理filter(异常转换过滤器),主要是处理AccessDeniedException和AuthenticationException,   
 134.        将给每个异常找到合适的"去向"  
 135.    -->   
 136.    <bean id="exceptionTranslationFilter"  
 137.          class="org.springframework.security.ui.ExceptionTranslationFilter"  
 138.          p:accessDeniedHandler-ref="accessDeniedHandler"  
 139.          p:authenticationEntryPoint-ref="authenticationEntryPoint"/>   
 140.  
 141.    <!-- 处理AccessDeniedException -->   
 142.    <bean id="accessDeniedHandler"  
 143.          class="org.springframework.security.ui.AccessDeniedHandlerImpl"  
 144.          p:errorPage="/accessDenied.jsp"/>   
 145.    <!--  -->   
 146.    <bean id="authenticationEntryPoint"  
 147.          class="org.springframework.security.ui.webapp.AuthenticationProcessingFilterEntryPoint"  
 148.          p:loginFormUrl="/login.action"  
 149.          p:forceHttps="false"/>   
 150.  
 151.    <!--   
 152.         使用过滤器安全拦截器保护资源   
 153.         filterSecurityInterceptor在执行转向目标url前检查objectDefinitionSource中设定的用户权限信息,   
 154.          安全强制过滤器负责拦截请求,判断请求是否安全,并且给予认证和访问决策管理器一个机会来验证用户的身份和权限   
 155.          过程:   
 156.             首先,过滤器安全拦截器使用authenticationManager调用自己的provider来对用户的认证信息进行验证并获取用户已有的权限。   
 157.             然后,使用访问决策管理器来判断用户是否拥用合适的授权来访问受保护的资源。   
 158.              (objectDefinitionSource属性定义了访问URL需要的权限信息)   
 159.             最后,有投票者根据用户持有认证和访问url需要的属性,调用自己的voter来投票,决定是否允许访问。   
 160.    -->   
 161.    <bean id="filterSecurityInterceptor"  
 162.          class="org.springframework.security.intercept.web.FilterSecurityInterceptor"  
 163.          p:authenticationManager-ref="authenticationManager"  
 164.          p:accessDecisionManager-ref="accessDecisionManager"  
 165.          p:objectDefinitionSource-ref="objectDefinitionSource">   
 166.    </bean>   
 167.    <bean id="objectDefinitionSource"  
 168.          class="com.shopin.modules.security.intercept.web.DataBaseFilterInvocationDefinitionSource"  
 169.          p:convertUrlToLowercaseBeforeComprison="true"  
 170.          p:useAntPath="true"  
 171.          p:cacheManager-ref="securityCacheManager"/>   
 172.    <!--   
 173.         访问决策管理器   
 174.           验证用户是否有权限访问相应的资源(filterSecurityInterceptor中objectDefinitionSource属性定义的访问URL需要的属性信息)   
 175.    -->   
 176.    <bean id="accessDecisionManager"  
 177.          class="org.springframework.security.vote.AffirmativeBased"  
 178.          p:allowIfAllAbstainDecisions="false">   
 179.        <property name="decisionVoters">   
 180.            <list>   
 181.                <bean class="org.springframework.security.vote.RoleVoter"/>   
 182.                <bean class="org.springframework.security.vote.AuthenticatedVoter"/>   
 183.            </list>   
 184.        </property>   
 185.    </bean>   
 186.  
 187.    <bean id="rememberMeServices"  
 188.          class="org.springframework.security.ui.rememberme.TokenBasedRememberMeServices"  
 189.          p:key="springsecurity"  
 190.          p:userDetailsService-ref="userDetailsService"/>   
 191.  
 192.    <bean id="daoAuthenticationProvider"  
 193.          class="org.springframework.security.providers.dao.DaoAuthenticationProvider"  
 194.          p:userCache-ref="userCache"  
 195.          p:passwordEncoder-ref="passwordEncoder"  
 196.          p:userDetailsService-ref="userDetailsService"/>   
 197.    <bean id="passwordEncoder"  
 198.          class="org.springframework.security.providers.encoding.Md5PasswordEncoder"/>   
 199.  
 200.    <!-- 缓存配置 -->   
 201.    <bean id="resourceCache"  
 202.          class="com.shopin.modules.security.resourcedetails.EhCacheResourceCache">   
 203.        <property name="cache">   
 204.            <bean class="org.springframework.cache.ehcache.EhCacheFactoryBean"  
 205.                  p:cacheManager-ref="cacheManager"  
 206.                  p:cacheName="resourceCache"/>   
 207.        </property>   
 208.    </bean>   
 209.    <bean id="userCache"  
 210.          class="org.springframework.security.providers.dao.cache.EhCacheBasedUserCache">   
 211.        <property name="cache">   
 212.            <bean class="org.springframework.cache.ehcache.EhCacheFactoryBean"  
 213.                  p:cacheManager-ref="cacheManager"  
 214.                  p:cacheName="userCache"/>   
 215.        </property>   
 216.    </bean>   
 217.    <bean id="cacheManager"  
 218.          class="org.springframework.cache.ehcache.EhCacheManagerFactoryBean"  
 219.          p:configLocation="classpath:ehcache-hibernate.xml">   
 220.    </bean>   
 221.  
 222.    <bean id="userDetailsService" class="cn.shopin.miniweb.service.security.UserDetailServiceImpl"/>   
 223.  
 224.    <bean id="securityCacheManager"  
 225.          class="org.springframework.transaction.interceptor.TransactionProxyFactoryBean"  
 226.          p:transactionManager-ref="transactionManager"  
 227.          p:proxyTargetClass="true">   
 228.        <property name="target">   
 229.            <bean class="com.shopin.modules.security.cache.SecurityCacheManagerImpl"  
 230.                  p:sessionFactory-ref="sessionFactory"  
 231.                  p:resourcCache-ref="resourceCache"/>   
 232.        </property>   
 233.        <property name="transactionAttributes">   
 234.            <props>   
 235.                <prop key="init*">PROPAGATION_REQUIRED,readOnly</prop>   
 236.                <prop key="get*">PROPAGATION_REQUIRED,readOnly</prop>   
 237.            </props>   
 238.        </property>   
 239.    </bean>   
 240.  
 241.    <bean id="loggerListener"  
 242.          class="org.springframework.security.event.authentication.LoggerListener"/>   
 243.  
 244.</beans>  

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics