SpringSecurity配置详解

    <?xml version="1.0" encoding="UTF-8"?>  
    <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
           xmlns:p="http://www.springframework.org/schema/p" 
           xmlns:security="http://www.springframework.org/schema/security" 
           xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd  
            http://www.springframework.org/schema/security http://www.springframework.org/schema/security/spring-security-2.0.2.xsd">  
     
        <!--  
                FilterChainProxy会按顺序来调用这些filter,使这些filter能享用Spring Ioc的功能,  
                CONVERT_URL_TO_LOWERCASE_BEFORE_COMPARISON 定义url比较前先转为小写  
                PATTERN_TYPE_APACHE_ANT 定义使用Apache ant的匹配模式  
             -->  
        <bean id="springSecurityFilterChain" 
              class="org.springframework.security.util.FilterChainProxy">  
            <property name="filterInvocationDefinitionSource">  
                <value><![CDATA[  
                        CONVERT_URL_TO_LOWERCASE_BEFORE_COMPARISON  
                        PATTERN_TYPE_APACHE_ANT  
                        /**=httpSessionContextIntegrationFilter,logoutFilter,authenticationProcessingFilter,securityContextHolderAwareRequestFilter,rememberMeProcessingFilter,anonymousProcessingFilter,exceptionTranslationFilter,filterSecurityInterceptor  
                    ]]></value>  
            </property>  
        </bean>  
        <!--  
            集成过滤器( HttpSessionContextIntegrationFilter 是集成过滤器的一个实现)  
               每次 request 前 HttpSessionContextIntegrationFilter 从 Session 中获取 Authentication 对象,在 request 完后  
               又把 Authentication 对象保存到 Session 中供下次 request 使用,此 filter 必须在其他 Acegi filter前使用  
        -->  
        <bean id="httpSessionContextIntegrationFilter" 
              class="org.springframework.security.context.HttpSessionContextIntegrationFilter"/>  
        <!--  
            退出(Logout)过滤器 退出登录操作  
        -->  
        <bean id="logoutFilter" 
              class="org.springframework.security.ui.logout.LogoutFilter">  
            <!-- 退出系统后系统跳转到此URL -->  
            <constructor-arg value="/login.action"/>  
            <!-- 退出系统后的操作(调用logout方法) -->  
            <constructor-arg>  
                <list>  
                    <!-- 实现了LogoutHandler接口(logout方法) -->  
                    <ref bean="rememberMeServices"/>  
                    <bean class="org.springframework.security.ui.logout.SecurityContextLogoutHandler"/>  
                </list>  
            </constructor-arg>  
        </bean>  
        <!--  
            处理表单认证filter:  
            1.authenticationManager     认证管理器  
            2.authenticationFailureUrl  定义登录失败时转向的页面  
            3.defaultTargetUrl        定义登录成功时转向的页面  
            4.filterProcessesUrl        定义登录请求的地址  
            5.rememberMeServices        在验证成功后添加cookie信息  
        -->  
        <bean id="authenticationProcessingFilter" 
              class="org.springframework.security.ui.webapp.AuthenticationProcessingFilter" 
              p:authenticationManager-ref="authenticationManager" 
              p:authenticationFailureUrl="/login.action?login_error=1" 
              p:defaultTargetUrl="/user.action" 
              p:filterProcessesUrl="/j_spring_security_check" 
              p:rememberMeServices-ref="rememberMeServices"/>  
        <!--  
            认证管理器( org.springframework.security.AuthenticationManager 接口)  
             org.springframework.security.providers.ProviderManager是认证管理器的一个实现,  
             ProviderManager通过遍历一个提供者的集合来实现身份验证,  
             直到某一个认证提供者能够成功地验证该用户的身份  
        -->  
        <!--  
            通过Providers提供认证者列表,如果一个认证提供者失败可以尝试另外一个认证提供者,以保证获取不同来源的身份认证,如  
            DaoAuthenticationProvider        从数据库中读取用户信息验证身份  
            AnonymousAuthenticationProvider  匿名用户身份认证  
            RememberMeAuthenticationProvider 已存cookie中的用户信息身份认证  
     
            其它的还有  
            AuthByAdapterProvider           使用容器的适配器验证身份  
            CasAuthenticationProvider       根据Yale中心认证服务验证身份, 用于实现单点登陆  
            JaasAuthenticationProvider      从JASS登陆配置中获取用户信息验证身份  
            RemoteAuthenticationProvider    根据远程服务验证用户身份  
            RunAsImplAuthenticationProvider 对身份已被管理器替换的用户进行验证  
            X509AuthenticationProvider      从X509认证中获取用户信息验证身份  
            TestingAuthenticationProvider   单元测试时使用  
     
            每个认证者会对自己指定的证明信息进行认证,如  DaoAuthenticationProvider 仅对 UsernamePasswordAuthenticationToken 这个证明信息进行认证。  
        -->  
        <bean id="authenticationManager" 
              class="org.springframework.security.providers.ProviderManager" 
              p:sessionController-ref="concurrentSessionController">  
            <property name="providers">  
                <list>  
                    <ref bean="daoAuthenticationProvider"/>  
                    <bean  
                            class="org.springframework.security.providers.anonymous.AnonymousAuthenticationProvider" 
                            p:key="springsecurity"/>  
                    <bean  
                            class="org.springframework.security.providers.rememberme.RememberMeAuthenticationProvider" 
                            p:key="springsecurity"/>  
                </list>  
            </property>  
        </bean>  
        <!-- 阻止用户在成功登录之后再进行一次成功登录 -->  
        <bean id="concurrentSessionController" 
              class="org.springframework.security.concurrent.ConcurrentSessionControllerImpl" 
              p:maximumSessions="1" 
              p:exceptionIfMaximumExceeded="true" 
              p:sessionRegistry-ref="sessionRegistry" 
              p:messageSource-ref="messageSource"/>  
     
        <bean id="sessionRegistry" 
              class="org.springframework.security.concurrent.SessionRegistryImpl"/>  
     
        <bean id="messageSource" 
              class="org.springframework.context.support.ReloadableResourceBundleMessageSource" 
              p:basename="/WEB-INF/classes/messages_zh_CN"/>  
     
        <bean id="securityContextHolderAwareRequestFilter" 
              class="org.springframework.security.wrapper.SecurityContextHolderAwareRequestFilter"/>  
        <!--  
           利用cookie自动登陆filter  
            当 SecurityContextHolder 中不存在 Authentication 用户授权信息,  
            rememberMeProcessingFilter 就会调用 autoLogin() 方法从cookie中获取用户信息,在验证 filter 之前使用  
        -->  
        <bean id="rememberMeProcessingFilter" 
              class="org.springframework.security.ui.rememberme.RememberMeProcessingFilter" 
              p:authenticationManager-ref="authenticationManager" 
              p:rememberMeServices-ref="rememberMeServices"/>  
        <!--  
            如果不存在任何授权信息时,自动添加匿名用户身份至 SecurityContextHolder 中  
        -->  
        <bean id="anonymousProcessingFilter" 
              class="org.springframework.security.providers.anonymous.AnonymousProcessingFilter" 
              p:key="springsecurity" 
              p:userAttribute="anonymousUser,ROLE_ANONYMOUS"/>  
        <!--  
           异常处理filter(异常转换过滤器),主要是处理 AccessDeniedException 和 AuthenticationException,  
            将给每个异常找到合适的"去向" 
        -->  
        <bean id="exceptionTranslationFilter" 
              class="org.springframework.security.ui.ExceptionTranslationFilter" 
              p:accessDeniedHandler-ref="accessDeniedHandler" 
              p:authenticationEntryPoint-ref="authenticationEntryPoint"/>  
     
        <!-- 处理 AccessDeniedException -->  
        <bean id="accessDeniedHandler" 
              class="org.springframework.security.ui.AccessDeniedHandlerImpl" 
              p:errorPage="/accessDenied.jsp"/>  
        <!-- 处理 AuthenticationException -->  
        <bean id="authenticationEntryPoint" 
              class="org.springframework.security.ui.webapp.AuthenticationProcessingFilterEntryPoint" 
              p:loginFormUrl="/login.action" 
              p:forceHttps="false"/>  
     
        <!--  
             使用过滤器安全拦截器保护资源  
             filterSecurityInterceptor 在执行转向目标 url 前检查 objectDefinitionSource 中设定的用户权限信息,  
              安全强制过滤器负责拦截请求,判断请求是否安全,并且给予认证和访问决策管理器一个机会来验证用户的身份和权限  
              过程:  
                 首先,过滤器安全拦截器使用 authenticationManager 调用自己的 provider 来对用户的认证信息进行验证并获取用户已有的权限。  
                 然后,使用访问决策管理器来判断用户是否拥用合适的授权来访问受保护的资源。  
                  (objectDefinitionSource 属性定义了访问 URL 需要的权限信息)  
                 最后,有投票者根据用户持有认证和访问 url 需要的属性,调用自己的 voter 来投票,决定是否允许访问。  
        -->  
        <bean id="filterSecurityInterceptor" 
              class="org.springframework.security.intercept.web.FilterSecurityInterceptor" 
              p:authenticationManager-ref="authenticationManager" 
              p:accessDecisionManager-ref="accessDecisionManager" 
              p:objectDefinitionSource-ref="objectDefinitionSource">  
        </bean>  
        <bean id="objectDefinitionSource" 
              class="com.shopin.modules.security.intercept.web.DataBaseFilterInvocationDefinitionSource" 
              p:convertUrlToLowercaseBeforeComprison="true" 
              p:useAntPath="true" 
              p:cacheManager-ref="securityCacheManager"/>  
        <!--  
             访问决策管理器  
               验证用户是否有权限访问相应的资源(filterSecurityInterceptor 中 objectDefinitionSource 属性定义的访问URL需要的属性信息)  
        -->  
        <bean id="accessDecisionManager" 
              class="org.springframework.security.vote.AffirmativeBased" 
              p:allowIfAllAbstainDecisions="false">  
            <property name="decisionVoters">  
                <list>  
                    <bean class="org.springframework.security.vote.RoleVoter"/>  
                    <bean class="org.springframework.security.vote.AuthenticatedVoter"/>  
                </list>  
            </property>  
        </bean>  
     
        <bean id="rememberMeServices" 
              class="org.springframework.security.ui.rememberme.TokenBasedRememberMeServices" 
              p:key="springsecurity" 
              p:userDetailsService-ref="userDetailsService"/>  
     
        <bean id="daoAuthenticationProvider" 
              class="org.springframework.security.providers.dao.DaoAuthenticationProvider" 
              p:userCache-ref="userCache" 
              p:passwordEncoder-ref="passwordEncoder" 
              p:userDetailsService-ref="userDetailsService"/>  
        <bean id="passwordEncoder" 
              class="org.springframework.security.providers.encoding.Md5PasswordEncoder"/>  
     
        <!-- 缓存配置 -->  
        <bean id="resourceCache" 
              class="com.shopin.modules.security.resourcedetails.EhCacheResourceCache">  
            <property name="cache">  
                <bean class="org.springframework.cache.ehcache.EhCacheFactoryBean" 
                      p:cacheManager-ref="cacheManager" 
                      p:cacheName="resourceCache"/>  
            </property>  
        </bean>  
        <bean id="userCache" 
              class="org.springframework.security.providers.dao.cache.EhCacheBasedUserCache">  
            <property name="cache">  
                <bean class="org.springframework.cache.ehcache.EhCacheFactoryBean" 
                      p:cacheManager-ref="cacheManager" 
                      p:cacheName="userCache"/>  
            </property>  
        </bean>  
        <bean id="cacheManager" 
              class="org.springframework.cache.ehcache.EhCacheManagerFactoryBean" 
              p:configLocation="classpath:ehcache-hibernate.xml">  
        </bean>  
     
        <bean id="userDetailsService" class="cn.shopin.miniweb.service.security.UserDetailServiceImpl"/>  
     
        <bean id="securityCacheManager" 
              class="org.springframework.transaction.interceptor.TransactionProxyFactoryBean" 
              p:transactionManager-ref="transactionManager" 
              p:proxyTargetClass="true">  
            <property name="target">  
                <bean class="com.shopin.modules.security.cache.SecurityCacheManagerImpl" 
                      p:sessionFactory-ref="sessionFactory" 
                      p:resourcCache-ref="resourceCache"/>  
            </property>  
            <property name="transactionAttributes">  
                <props>  
                    <prop key="init*">PROPAGATION_REQUIRED,readOnly</prop>  
                    <prop key="get*">PROPAGATION_REQUIRED,readOnly</prop>  
                </props>  
            </property>  
        </bean>  
     
        <bean id="loggerListener" 
              class="org.springframework.security.event.authentication.LoggerListener"/>  
     
    </beans> 

更多相关文章
  • centos6.6,kvm安装配置详解,让你秒会kvm
    KVM虚拟化安装配置详解-任志远环境:centos6.6,vmware workstation11(如果不是虚拟机可略过)KVM是指基于Linux内核的虚拟机,此虚拟拟需要linux内核支化功能:首先开启虚拟化功能(inter VT,AMD-V)file /sbin/init第一:准备工作(开启虚拟 ...
  • http://www.cnblogs.com/argb/p/3604340.html文章转载php-fpm 启动参数及重要配置详解约定几个目录/usr/local/php/sbin/php-fpm/usr/local/php/etc/php-fpm.conf/usr/local/php/etc/ph ...
  • Windows网络服务架构系列课程详解四---DNS高级技术配置详解
    Windows 网络服务架构系列课程详解(四)                          ------- DNS高级技术配置详解 1. DNS委派和子区域的理解在实际应用中,DNS的委派和子区域的创建起到至关重要的作用.DNS的委派:在实际应用当中,创建方法很简单,比如说benet公司是一家 ...
  • SOHO宽带路由器接入ISP配置详解
    [实验名称]SOHO宽带路由器接入ISP配置详解[实验目的]通过对D-Link SOHO宽带路由器进行接入到ISP的配置,使管理人员以后可以通过Web方式对宽带路由器进行基本的宽带接入方式的配置.[背景描述]某日,某小公司申请了一条ADSL宽带.这下公司沸腾 了,同事们都在兴高采烈谈论着这件事.这个 ...
  • X11,xorg.conf配置详解X11R7其实就是目前Ubuntu使用的X Server,它于2005年12月被释出,与之前的X11R6.9其实具有相同的源代码(Source Code).不过X11R7的模块化设计,可提高开发时的容易度.X11R重要目录与X11R7有关的软件,大多放在/usr及其 ...
  • FreeBSD Pure-ftpd 配置详解一.安装配置pure-ftpd[root@bsd01 ~]#cd /usr/ports/ftp/pure-ftpd[root@bsd01 pure-ftpd]#make install clean然后会出现“make config”的界面,选择需要的组件即 ...
  • Linux网络服务配置详解
  • 下面是activemq.xml中的配置详解.<beans  xmlns="http://www.springframework.org/schema/beans"  xmlns:amq="http://activemq.apache.org/schema/core ...
一周排行
  • [保留] 请教shell中set的用法浏览次数:336次2005年10月23日作者:very_99字号: 更多1在EXPECT中有set的使用,设置一些时间的,在shell中有什么关于set的设置吗?或者关于expe ...
  • 安装mysql   创建mysql数据目录 mkdir -p /usr/local/mysql --安装目录 mkdir -p /usr/local/mysql/data ---数据目录 创建mysql用户和组 gr ...
  • os.sep 可以取代操作系统特定的路径分割符.os.name字符串指示你正在使用的平台.比如对于Windows,它是'nt',而对于Linux/Unix用户,它是'posix'.os.getcwd()函数得到当前工 ...
  •  很白痴的一个问题,切困扰我一个晚上,哎! 做份笔记吧!PS:没玩过as的孩子!运行软件:  Adobe Flash Professional CS5新建一个actionscript3.0 文件,这时会生成一个.fl ...
  • 本文中提到的函数库有:<string> <cctype> <algorithm> <cmath> <cstdlib> <iomanip> < ...
  • Xshell实现windows上传文件到linux主机
    经常有这样的需求,我们在windows下载的软件包,如何上传到远程linux主机上?还有如 ...
  •   1. 登陸驗證碼無法顯示,servlet 3.0 對應 Tomcat 7.0 才能正常運行:2. 系統報錯,不能正常運行,先注釋掉 Struts2.xml 的  定义全局异常映射<global-except ...
  • 在Win7中怎样打开摄像头
    在Win7中怎样打开摄像头?标题所说的问题在我装了win7后也遇到了,当时我也只会用等下我 ...
  • VMWare-tools的安装过程     为了更好的解决虚拟机与主机的共享问题,VMware公司有一个VMWare-tools,来实现文件共享.这里主要讲的是在Windows下用Vmware虚拟Linux来与win ...
  • cisco交换机配置口令大全1.在基于IOS的交换机上设置主机名/系统名: switch(config)# hostname hostname 在基于CLI的交换机上设置主机名/系统名: switch(enable) ...