spring security 2.04 菜鸟设定

本人是菜鸟,E文也很烂,偏偏spring security更新很神速,版本之间相差特别大.网上有限的几个教材,也无法拿来就用.硬着头皮,借着spring security 2.x中文使用手册,再结合孙宁振的博文等,经过几天的奋战,终算能跑起来了.下面是根据自已理解,特写的教材.
本人表达能力有限,水平有限,只是由于spring security中文实例资料难找,特凭着脸皮厚,发表本教程,希引出大虾,作出权威的中文教材.是我等菜鸟之福了.

在这里,特别鸣谢spring security 2.x中文手册翻译者,孙宁振网友.

说明:本实例用到了 spring framework 2.5
               spring security 2.04
开发工具:netbeans 6.5 cr2中文版.

附件,是本人亲自调试通过的工程.
需要参考的网友,下载后,可用开发工具,按文件方式打开.能看见所有的源代码,
还有lib.至少netbeans 6.5是这样.
用户名:admin;密码123

菜鸟为了方便菜鸟,把spring security 2.04的下载地址也附上:
http://downloads.sourceforge.net/springframework/spring-security-2.0.4.zip?modtime=1223032765&big_mirror=0

spring官方网站:
www.springsource.org

目录:
1 Dao方式的认证授权原理
1.1 认证授权简略过程:
1.2 Spring security配置思路
2 Dao 形式的认证授权实例
2.1 Web.xml配置
2.2 spring securtity配置
2.2.1 命名空间
2.2.2 默认设定
2.2.3 认证设定
2.2.4 授权设定
2.3 完整的: spring-security.xml
2.4 Login.jsp



=========================正     文=========================


1 Dao方式的认证授权原理



1.1 认证授权简略过程:


(1) 用户输入用户名,密码

(2) 认证--------Authentication

根据用户输入信息,查询《用户权限资料表》,得到用户权限名
其中:
《用户权限资料表》的基本形式为:
用户名  密码 权限名1,权限名2,..权限名n

(3) 授权--------Invocation

根据权限名,查询《权限明细资料表》,得到具体权限.
其中:
  《权限明细资料表》,基本形式为:
网址(或网址加方法)  权限名1, 权限名2,.. 权限名n
  从中看出,权限,最终是某个网址可以由哪些角色的用户访问.

(4) Spring Security根据得到的网址,确定是否允许访问


(5) 其他处理(略)




1.2 Spring security配置思路

    揣摩官方的配置思路:
    官方设定完整的默认配置。关键环节,允许用户更改默认配置。有一部份默认配置是核心的(如认证与授权),不允许用户替换官方默认配置,但允许用户在这些默认配置的开始或结束后运行用户的配置;有一部份默认配置不是核心的,完全允许用户替代。
在这种假设情况下:
spring security2的这项操作“http标签中,让用户选择官方提供的默认配置”得到解释。
spring security2的这条标签“<custom-filter before="过滤器假名"/>”得到合理解释。同时,认证过滤器与授权过滤器不允许替换默认过滤器也得到解释。




2 Dao   形式的认证授权实例

所谓Dao形式,指认证中所需要的用户权限资料表,权限明细资料表,都放在数据库中,这两个资料表的更新、删除、查询等维护操作由用户编写的dao 完成。这个dao与spring security一起完成用户认证授权工作。这里,为了突出spring security使用方法,这里的dao不与数据库发生联系,仅仅返回spring security所需的数据(数据在dao内中是固定的。),在实际使用中,由用户自行扩展。

2.1 Web.xml配置

Spring  Security 是用servlet的过滤器实现认证的,因此需要在web.xml中进行配置。格式是固定的。最好位于所有过滤器前面。
代码:---------web.xml部份代码.

Xml代码 复制代码
  1. <filter>  
  2.      <filter-name>springSecurityFilterChain</filter-name>  
  3.      <filter-class>  
  4.          org.springframework.web.filter.DelegatingFilterProxy   
  5.      </filter-class>  
  6.  </filter>  
  7.  <filter-mapping>  
  8.      <filter-name>springSecurityFilterChain</filter-name>  
  9.      <url-pattern>/*</url-pattern>  
  10.  </filter-mapping>  



由于spring security是由spring进行配置,还需在web.xml指定spring security的配置文件。
代码:---------------web.xml部份代码.

Xml代码 复制代码
  1. <context-param>  
  2.     <param-name>contextConfigLocation</param-name>  
  3.     <param-value>  
  4.         /WEB-INF/spring-security.xml   
  5.     </param-value>  
  6. </context-param>  
  7.   
  8. <listener>  
  9.     <listener-class>  
  10.         org.springframework.web.context.ContextLoaderListener   
  11.     </listener-class>  
  12. </listener>  


说明:
A  指定了spring监听器,启动spring.
B  spring securtity的配置文件为: spring-security.xml


2.2 spring securtity配置

注意:配置文件为spring-security.xml


2.2.1 命名空间

核心代码:----- spring-security.xml

Xml代码 复制代码
  1. <?xml version="1.0" encoding="UTF-8"?>  
  2. <b:beans xmlns="http://www.springframework.org/schema/security"  
  3.     xmlns:b="http://www.springframework.org/schema/beans"  
  4.     xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"  
  5.     xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.0.xsd   
  6.                         http://www.springframework.org/schema/security http://www.springframework.org/schema/security/spring-security-2.0.1.xsd">  


说明:
    A  ”b:beans”,中的b是命名空间的别名,可由用户自行取名;官方的实例是这样的形式。
    B   spring-security.xml 中所有的bean的定义,都将前缀”b:bean”.




2.2.2 默认设定

   所谓默认设定,指spring security 2 已经认定好的了一系列过滤器。省去了早先版本设定一长串过滤器的烦恼。


(1)   最省事的设定之一

Xml代码 复制代码
  1. <http auto-config='true'>  
  2.   <intercept-url pattern="/**" access="ROLE_USER" />  
  3. </http>  


说明:
     A   这里,要求spring security 2 完全按默认处理。通常内存权限设定很管用。
其中:<intercept-url pattern="/**" access="ROLE_USER" />,规定了:名为ROLE_USER的权限,可以访问整个网站。
     B  权限名称有规定。至少:前缀“ROLE_”的由大写字母构成的字符串,符合规定。如:ROLE_XXX。


(2) 最省事的设定之二

 

Xml代码 复制代码
  1. <http>  
  2.   <intercept-url pattern="/**" access="ROLE_USER" />  
  3.   <form-login />  
  4.   <anonymous />  
  5.   <http-basic />  
  6.   <logout />  
  7.   <remember-me />  
  8. </http>  


  说明:
       A  这里与前面的方式完全等同。
       B  form-login 指定了登陆界面。如果没具体指定,spring security将用自身的登陆界面。
       C  anonymous ,允许匿名访问网站(估计没保护的网页, 匿名者都能访问).
      D  http-basic  加载系列默认的过滤器。
至少有:AuthenticationProcessingFilter(认证过滤器),
                 FilterSecurityInterceptor(授权过滤器)
      E  凡是这里加载了的过滤器,用户都不能自行设定过滤器替代它们。也就是说AuthenticationProcessingFilter(认证过器) 与FilterSecurityInterceptor(授权过滤器)用户不能替代。
       F  凡是这里加载了的过滤器,用户可以自行定义它们中同类的过滤器,挂在相应默认过滤器的前或者后,但是不能替代。
       G   logout,设定默认的LogoutFilter过滤器。
       H    remember-me,设定RememberMeProcessingFilter过滤器。
       I   E与F适用于D、G、H


(3) 本例中http设定-------- spring-security.xml

Xml代码 复制代码
  1. <http>          
  2.     <intercept-url pattern="/**" access="ROLE_USER"/>  
  3.     <intercept-url pattern="/login.jsp*" filters="none"/>  
  4.     <form-login login-page='/login.jsp'/>  
  5.   
  6.     <http-basic />  
  7.     <logout /><!--加载离开过滤器-->  
  8. </http>  


  说明:
     A  好像,非得要指定一个内存权限。
      B 

Xml代码 复制代码
  1. <intercept-url pattern="/login.jsp*" filters="none"/>  
  2. <form-login login-page='/login.jsp'/>  


  上面这两句,是指定用户自已的登陆界面,是固定形式.前者,表示login.jsp暴露给所有用户,无需保护。如果不要前句,将出现浏览器不允许cookie加载之类的错误提示。


2.2.3 认证设定

spring security 2提供了一个专门的认证设定。本节中用户权限,都是指为一个用户设定一个权限名。而这个权限名的定义,不在认证设定处理范围之内,将由授权处理器处理。

(1) 内存设定用户权限例子

Xml代码 复制代码
  1. <authentication-provider>  
  2.     <user-service>  
  3.         <user name="张三" password="123" authorities="ROLE_USER,ROLE_DDD" />  
  4.     </user-service>  
  5. </authentication-provider>  


  说明:这里为张三指定了密码,以及两个权限:“ROLE_USER”与“ROLE_DDD”。


(2) Dao形式设定用户权限的例子--------- spring-security.xml

Xml代码 复制代码
  1. <authentication-provider user-service-ref='userDetailsService'/>  
  2. <b:bean id="userDetailsService"  
  3.     class="fyh.pub.login.security.UserDetailsSerivceImpl">  
  4. </b:bean>  


  其中:fyh.pub.login.security.UserDetailsSerivceImpl是用户自已写的类。这个类实现了spring security 2的UserDetailsService接口。源代码如下:


(3) UserDetailsService源代码
UserDetailsSerivceImpl.java

Java代码 复制代码
  1. package fyh.pub.login.security;   
  2.   
  3. import fyh.pub.login.model.User;   
  4. import org.springframework.dao.DataAccessException;   
  5. import org.springframework.security.userdetails.UserDetails;   
  6. import org.springframework.security.userdetails.UserDetailsService;   
  7. import org.springframework.security.userdetails.UsernameNotFoundException;   
  8.   
  9. public class UserDetailsSerivceImpl implements UserDetailsService {   
  10.     public UserDetails loadUserByUsername(String username)   
  11.             throws UsernameNotFoundException, DataAccessException {   
  12.         UserDetails user=new User();   
  13.         return user;   
  14.     }   
  15. }  
package fyh.pub.login.security;

import fyh.pub.login.model.User;
import org.springframework.dao.DataAccessException;
import org.springframework.security.userdetails.UserDetails;
import org.springframework.security.userdetails.UserDetailsService;
import org.springframework.security.userdetails.UsernameNotFoundException;

public class UserDetailsSerivceImpl implements UserDetailsService {
	public UserDetails loadUserByUsername(String username)
			throws UsernameNotFoundException, DataAccessException {
        UserDetails user=new User();
		return user;
	}
}


说明:User是用户自已写的类,这个类实现了spring security2的UserDetails接口。


(4) User源代码

  User.java

Java代码 复制代码
  1. package fyh.pub.login.model;   
  2. import java.util.ArrayList;   
  3. import java.util.List;   
  4. import org.springframework.security.GrantedAuthority;   
  5. import org.springframework.security.GrantedAuthorityImpl;   
  6. import org.springframework.security.userdetails.UserDetails;   
  7.   
  8. public class User implements UserDetails {   
  9.     private String      id="0";   
  10.     private String      username="admin";   
  11.     private String      password="123";   
  12.     //省略getter and setter    
  13.   
  14.     public GrantedAuthority[] getAuthorities() {   
  15.         List<GrantedAuthority> list = new ArrayList<GrantedAuthority>();   
  16.         list.add(new GrantedAuthorityImpl("ROLE_XXX"));   
  17.         list.add(new GrantedAuthorityImpl("ROLE_DDD"));   
  18.         return list.toArray(new GrantedAuthority[list.size()]);   
  19.     }   
  20.   
  21.     public boolean isAccountNonExpired() {return true;}   
  22.     public boolean isAccountNonLocked() {return true;}   
  23.     public boolean isCredentialsNonExpired() {  return true;    }   
  24.     public boolean isEnabled() {return true;    }       
  25. }  
package fyh.pub.login.model;
import java.util.ArrayList;
import java.util.List;
import org.springframework.security.GrantedAuthority;
import org.springframework.security.GrantedAuthorityImpl;
import org.springframework.security.userdetails.UserDetails;

public class User implements UserDetails {
    private String		id="0";
    private String		username="admin";
    private String		password="123";
    //省略getter and setter 

    public GrantedAuthority[] getAuthorities() {
        List<GrantedAuthority> list = new ArrayList<GrantedAuthority>();
        list.add(new GrantedAuthorityImpl("ROLE_XXX"));
        list.add(new GrantedAuthorityImpl("ROLE_DDD"));
        return list.toArray(new GrantedAuthority[list.size()]);
    }

    public boolean isAccountNonExpired() {return true;}
    public boolean isAccountNonLocked() {return true;}
    public boolean isCredentialsNonExpired() {	return true;	}
    public boolean isEnabled() {return true;	}    
}





2.2.4 授权设定

这里主要是用了FilterSecurityInterceptor过滤器。


(1) 引子--------用户自行设定过滤器

设定格式形如:

Java代码 复制代码
  1. <beans:bean id="myFileterName" class="myFileterClass">   
  2.   <custom-filter position="过滤器假名"/>   
  3. </beans:bean>  
  <beans:bean id="myFileterName" class="myFileterClass">
    <custom-filter position="过滤器假名"/>
  </beans:bean>


其中:
A  ” position”表示本过滤器,要替代其后的过滤器. "过滤器假名"指示了被替代的过滤器名。
    B  除了” position”,还有”before” 与”after”两种方式。分别表示将要把本过滤器挂在其后的过滤器前或后。
  例:这里设定了一个abc的过滤器,该过滤器,将挂在http中设定的过滤器-----FilterSecurityInterceptor的前面。

Java代码 复制代码
  1. <b:bean id="abc"  
  2.     class="org.springframework.security.intercept.web.FilterSecurityInterceptor">   
  3.     <custom-filter before="FILTER_SECURITY_INTERCEPTOR"/>   
  4. </b:bean>  
    <b:bean id="abc"
        class="org.springframework.security.intercept.web.FilterSecurityInterceptor">
        <custom-filter before="FILTER_SECURITY_INTERCEPTOR"/>
    </b:bean>


 


(2) 引子--------标准过滤器假名和顺序

Xml代码 复制代码
  1. 假名                                      过滤器类   
  2. CHANNEL_FILTER                   ChannelProcessingFilter   
  3. CONCURRENT_SESSION_FILTER           ConcurrentSessionFilter   
  4. SESSION_CONTEXT_INTEGRATION_FILTER  HttpSessionContextIntegrationFilter   
  5. LOGOUT_FILTER                           LogoutFilter   
  6. X509_FILTER                   X509PreAuthenticatedProcessigFilter   
  7. PRE_AUTH_FILTER                    AstractPreAuthenticatedProcessingFilter   Subclasses   
  8. CAS_PROCESSING_FILTER                  CasProcessingFilter   
  9. AUTHENTICATION_PROCESSING_FILTER         AuthenticationProcessingFilter   
  10. BASIC_PROCESSING_FILTER                 BasicProcessingFilter   
  11. SERVLET_API_SUPPORT_FILTER           SecurityContextHolderAwareRequestFilter   
  12. REMEMBER_ME_FILTER                           RememberMeProcessingFilter   
  13. ANONYMOUS_FILTER    AnonymousProcessingFilter   
  14. EXCEPTION_TRANSLATION_FILTER          ExceptionTranslationFilter   
  15. NTLM_FILTER                         NtlmProcessingFilter   
  16. FILTER_SECURITY_INTERCEPTOR                FilterSecurityInterceptor   
  17. SWITCH_USER_FILTER                     SwitchUserProcessingFilter  




(3) 定义自已的授权过滤器

由于前面, http中已经设定了默认的过滤器。因此,这里自行设定的过滤器将挂在滤认过滤器FilterSecurityInterceptor 的前面。注意:无法替代。
源代码: spring-security.xml

Java代码 复制代码
  1. <b:bean id="filterSecurityInterceptor11"  
  2.      class="org.springframework.security.intercept.web.FilterSecurityInterceptor">   
  3.      <custom-filter before="FILTER_SECURITY_INTERCEPTOR"/>   
  4.      <b:property name="authenticationManager" ref="authenticationManager" />   
  5.      <b:property name="accessDecisionManager" ref="accessDecisionManager" />   
  6.      <b:property name="objectDefinitionSource"  
  7.          ref="databaseFilterInvocationDefinitionSource" />   
  8.  </b:bean>  
 
   <b:bean id="filterSecurityInterceptor11"
        class="org.springframework.security.intercept.web.FilterSecurityInterceptor">
        <custom-filter before="FILTER_SECURITY_INTERCEPTOR"/>
        <b:property name="authenticationManager" ref="authenticationManager" />
        <b:property name="accessDecisionManager" ref="accessDecisionManager" />
        <b:property name="objectDefinitionSource"
            ref="databaseFilterInvocationDefinitionSource" />
    </b:bean>


其中:authenticationManager 是认证管理器。accessDecisionManager是决策管理器。databaseFilterInvocationDefinitionSource是授权管理器(是根据我的理解起的名)。它们随后设定。


(4) authenticationManager设定

    源代码: spring-security.xml

Xml代码 复制代码
  1. <b:bean id="authenticationManager"  
  2.     class="org.springframework.security.providers.ProviderManager">  
  3.     <b:property name="providers">  
  4.         <b:list>  
  5.             <b:ref local="daoAuthenticationProvider" />  
  6.         </b:list>  
  7.     </b:property>  
  8. </b:bean>  
  9. <b:bean id="daoAuthenticationProvider"  
  10.     class="org.springframework.security.providers.dao.DaoAuthenticationProvider">  
  11.     <b:property name="userDetailsService" ref="userDetailsService" />  
  12. </b:bean>  


   其中:authenticationManager实例----引用了---->daoAuthenticationProvider实例,
        daoAuthenticationProvider实例----引用了----> userDetailsService实例,
        而userDetailsService实例在前面的《2.2.3认证设定》(2)中已经设定。


(5) accessDecisionManager设定

决策管理器, 经过投票机制来决定是否可以访问某一资源        allowIfAllAbstainDecisions为false时,如果有一个以上的decisionVoters投票通过,则授权通过。 可选的决策机制: ConsensusBased和 UnanimousBased。
源代码: spring-security.xml

Xml代码 复制代码
  1. <b:bean id="accessDecisionManager"  
  2.     class="org.springframework.security.vote.AffirmativeBased">  
  3.     <b:property name="decisionVoters">  
  4.         <b:list>  
  5.             <b:bean class="org.springframework.security.vote.RoleVoter">  
  6.                 <b:property name="rolePrefix" value="" />  
  7.             </b:bean>  
  8.         </b:list>  
  9.     </b:property>  
  10. </b:bean>  




(6) databaseFilterInvocationDefinitionSource-----是它获得权限明细资料

    该类,是通过LinkedHashMap对象,传递权限明细资料的。
源代码: spring-security.xml

Xml代码 复制代码
  1.  class="org.springframework.security.intercept.web.DefaultFilterInvocationDefinitionSource">  
  2.     <!-- 匹配url的matcher -->  
  3.     <b:constructor-arg type="org.springframework.security.util.UrlMatcher"  
  4.         ref="antUrlPathMatcher" />  
  5.     <!-- url对应authority的map -->  
  6.     <b:constructor-arg type="java.util.LinkedHashMap" ref="requestMap" />  
  7. </b:bean>  

  
说明:
A   antUrlPathMatcher是定义的url格式,随后定义。
B   requestMap 装载着权限明细资料。随后定义。


(7) antUrlPathMatcher
源代码: spring-security.xml

Xml代码 复制代码
  1. <b:bean id="antUrlPathMatcher"  
  2.      class="org.springframework.security.util.AntUrlPathMatcher" />  




(8) requestMap------它身上有权限明细资料

源代码: spring-security.xml

Xml代码 复制代码
  1. <b:bean id="requestMap"  
  2.     class="fyh.pub.login.security.RequestMapFactoryBean"  
  3.     init-method="init">  
  4. </b:bean>  


   说明:RequestMapFactoryBean是由用户自定义的一个类,该类的init方法,返回一个LinkedHashMap对象。随后给出RequestMapFactoryBean的源代码


(9) RequestMapFactoryBean

RequestMapFactoryBean.java

Java代码 复制代码
  1. package fyh.pub.login.security;   
  2.   
  3. import java.util.LinkedHashMap;    
  4. import org.springframework.beans.factory.FactoryBean;   
  5. import org.springframework.security.ConfigAttribute;   
  6. import org.springframework.security.ConfigAttributeDefinition;   
  7. import org.springframework.security.SecurityConfig;   
  8. import org.springframework.security.intercept.web.RequestKey;   
  9.   
  10. public class RequestMapFactoryBean implements FactoryBean {   
  11.     private LinkedHashMap<RequestKey, ConfigAttributeDefinition> requestMap;   
  12.     public void init() {   
  13.         requestMap = new LinkedHashMap<RequestKey, ConfigAttributeDefinition>();      
  14.             RequestKey key = new RequestKey("/**");   
  15.             ConfigAttribute attribute = new SecurityConfig("ROLE_XXX");   
  16.             ConfigAttributeDefinition definition = new ConfigAttributeDefinition(   
  17.                     attribute);   
  18.             requestMap.put(key, definition);   
  19.                
  20.             key = new RequestKey("/login.jsp");   
  21.             attribute = new SecurityConfig("ROLE_EEE");   
  22.             definition = new ConfigAttributeDefinition(   
  23.                     attribute);   
  24.             requestMap.put(key, definition);   
  25.     }   
  26.   
  27.     public Object getObject() throws Exception {   
  28.         if (requestMap == null) {init();}   
  29.         return requestMap;   
  30.     }   
  31.   
  32.     public Class getObjectType() {return LinkedHashMap.class;   }   
  33.     public boolean isSingleton() {return true;}   
  34.   
  35.   
  36. }  
package fyh.pub.login.security;

import java.util.LinkedHashMap; 
import org.springframework.beans.factory.FactoryBean;
import org.springframework.security.ConfigAttribute;
import org.springframework.security.ConfigAttributeDefinition;
import org.springframework.security.SecurityConfig;
import org.springframework.security.intercept.web.RequestKey;

public class RequestMapFactoryBean implements FactoryBean {
	private LinkedHashMap<RequestKey, ConfigAttributeDefinition> requestMap;
	public void init() {
		requestMap = new LinkedHashMap<RequestKey, ConfigAttributeDefinition>();	 
			RequestKey key = new RequestKey("/**");
			ConfigAttribute attribute = new SecurityConfig("ROLE_XXX");
			ConfigAttributeDefinition definition = new ConfigAttributeDefinition(
					attribute);
			requestMap.put(key, definition);
            
            key = new RequestKey("/login.jsp");
			attribute = new SecurityConfig("ROLE_EEE");
			definition = new ConfigAttributeDefinition(
					attribute);
			requestMap.put(key, definition);
	}

	public Object getObject() throws Exception {
		if (requestMap == null) {init();}
		return requestMap;
	}

	public Class getObjectType() {return LinkedHashMap.class;	}
	public boolean isSingleton() {return true;}


}


说明:
A    这里,在类中固定了两个权限。
     整个网站可被ROLE_XXX 访问。
     /login.jsp 可被ROLE_EEE访问。
B   网址作为 LinkedHashMap的key,权限名放在ConfigAttributeDefinition 中,作为LinkedHashMap的值。


2.3 完整的spring-seurity.xml

Xml代码 复制代码
  1. <?xml version="1.0" encoding="UTF-8"?>  
  2. <b:beans xmlns="http://www.springframework.org/schema/security"  
  3.     xmlns:b="http://www.springframework.org/schema/beans"  
  4.     xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"  
  5.     xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.0.xsd   
  6.                         http://www.springframework.org/schema/security http://www.springframework.org/schema/security/spring-security-2.0.1.xsd">  
  7.   
  8.   
  9.     <http>  
  10.         <intercept-url pattern="/**" access="ROLE_USER"/>  
  11.         <intercept-url pattern="/login.jsp*" filters="none"/>  
  12.         <form-login login-page='/login.jsp'/>  
  13.         <http-basic />  
  14.         <logout /><!--加载离开过滤器-->  
  15.     </http>  
  16.   
  17.    <!--设用户权限, 权限表示方式为:用户名 密码 权限名列表.   
  18.        内存设置方式如下例:   
  19.        <authentication-provider>  
  20.             <user-service>  
  21.                 <user name="张三" password="123" authorities="ROLE_USER,ROLE_DDD" />  
  22.             </user-service>  
  23.         </authentication-provider>  
  24.    -->  
  25.   
  26.    <!--dao方式设置用户权限-->  
  27.    <authentication-provider user-service-ref='userDetailsService'/>  
  28.     <b:bean id="userDetailsService"  
  29.         class="fyh.pub.login.security.UserDetailsSerivceImpl">  
  30.     </b:bean>  
  31.   
  32.   
  33.   
  34.     <!--***********************************************************************   
  35.     *************************************************************************-->  
  36.     <!--  
  37.         负责授权的filter,检查Authentication所授予的权限是否可以访问被访问的资源  
  38.     -->  
  39.     <b:bean id="filterSecurityInterceptor11"  
  40.         class="org.springframework.security.intercept.web.FilterSecurityInterceptor">  
  41.         <custom-filter before="FILTER_SECURITY_INTERCEPTOR"/>  
  42.         <b:property name="authenticationManager" ref="authenticationManager" />  
  43.         <b:property name="accessDecisionManager" ref="accessDecisionManager" />  
  44.         <b:property name="objectDefinitionSource"  
  45.             ref="databaseFilterInvocationDefinitionSource" />  
  46.     </b:bean>  
  47.   
  48.     <b:bean id="authenticationManager"  
  49.         class="org.springframework.security.providers.ProviderManager">  
  50.         <b:property name="providers">  
  51.             <b:list>  
  52.                 <b:ref local="daoAuthenticationProvider" />  
  53.             </b:list>  
  54.         </b:property>  
  55.     </b:bean>  
  56.     <b:bean id="daoAuthenticationProvider"  
  57.         class="org.springframework.security.providers.dao.DaoAuthenticationProvider">  
  58.         <b:property name="userDetailsService" ref="userDetailsService" />  
  59.     </b:bean>  
  60.        
  61.     <b:bean id="accessDecisionManager"  
  62.         class="org.springframework.security.vote.AffirmativeBased">  
  63.         <b:property name="decisionVoters">  
  64.             <b:list>  
  65.                 <b:bean class="org.springframework.security.vote.RoleVoter">  
  66.                     <b:property name="rolePrefix" value="" />  
  67.                 </b:bean>  
  68.             </b:list>  
  69.         </b:property>  
  70.     </b:bean>  
  71.   
  72.     <b:bean id="databaseFilterInvocationDefinitionSource"  
  73.         class="org.springframework.security.intercept.web.DefaultFilterInvocationDefinitionSource">  
  74.         <b:constructor-arg type="org.springframework.security.util.UrlMatcher"  
  75.             ref="antUrlPathMatcher" />  
  76.         <!-- url对应authority的map -->  
  77.         <b:constructor-arg type="java.util.LinkedHashMap" ref="requestMap" />  
  78.     </b:bean>  
  79.   
  80.     <b:bean id="antUrlPathMatcher"  
  81.         class="org.springframework.security.util.AntUrlPathMatcher" />  
  82.   
  83.     <b:bean id="requestMap"  
  84.         class="fyh.pub.login.security.RequestMapFactoryBean"  
  85.         init-method="init">  
  86.     </b:bean>  
  87.       
  88. </b:beans>  





2.4 Login.jsp
说明: 如果用户,要用自已的登陆界面,需要
(1) 把form的action设成j_spring_security_check
(2) 用户名设成j_username
(3) 密码名设成j_password
以上三点,是spring security的约定。

login.jsp核心代码

Jsp代码 复制代码
  1. <form action="j_spring_security_check" method="post">   
  2.        <table>   
  3.             <tr>   
  4.                 <td><label for="username">用户名:</label></td>   
  5.                 <td><input type="text" id="username" name="j_username"  
  6.                        value="${SPRING_SECURITY_LAST_USERNAME}"/></td>   
  7.             </tr>   
  8.             <tr>   
  9.                 <td><label for="password">密码:</label></td>   
  10.                 <td><input type="password" id="password" name="j_password" value=""/></td>   
  11.             </tr>   
  12.             <tr><td></td>   
  13.                 <td><input type="checkbox" name="_spring_security_remember_me">两周内记住我</td>   
  14.             </tr>   
  15.             <tr><td colspan="2"><input type="submit" value="提交"/>   
  16.             <input type="reset" value="重置"/></td></tr>   
  17.        </table>   
  18.    </form>  
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值