主题:Spring Security 2 配置精讲

主题:Spring Security 2 配置精讲
论坛上看了不少Spring Security的相关文章。这些文章基本上都还是基于Acegi-1.X的配置方式,而主要的配置示例也来自于SpringSide的贡献。

众所周知,Spring Security针对Acegi的一个重大的改进就在于其配置方式大大简化了。所以如果配置还是基于Acegi-1.X这样比较繁琐的配置方式的话,那么 我们还不如直接使用Acegi而不要去升级了。所以在这里,我将结合一个示例,重点讨论一下Spring Security 2是如何进行配置简化的。

搭建基础环境

首先我们为示例搭建基本的开发环境,环境的搭建方式,可以参考我的另外一篇文章:http://www.javaeye.com/wiki/struts2/1321-struts2-development-environment-to-build

整个环境的搭建包括:创建合适的目录结构、加入了合适的Library,加入了基本的Jetty启动类、加入基本的配置文件等。最终的项目结构,可以参考我的附件。

参考文档

这里主要的参考文档是Spring Security的自带的Reference。网络上有一个它的中文翻译,地址如下:http://www.family168.com/tutorial/springsecurity/html/springsecurity.html

除此之外,springside有一个比较完整的例子,不过是基于Acegi的,我也参阅了其中的一些实现。

Spring Security基本配置

Spring Security是基于Spring的的权限认证框架,对于Spring和Acegi已经比较熟悉的同学对于之前的配置方式应该已经非常了解。接下来的例子,将向大家展示Spring Security基于schema的配置方式。

最小化配置

1. 在web.xml文件中加入Filter声明

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

这个Filter会拦截所有的URL请求,并且对这些URL请求进行Spring Security的验证。

注意,springSecurityFilterChain这个名称是由命名空间默认创建的用于处理web安全的一个内部的bean的id。所以你在你的Spring配置文件中,不应该再使用这个id作为你的bean。

与Acegi的配置不同,Acegi需要自行声明一个Spring的bean来作为Filter的实现,而使用Spring Security后,无需再额外定义bean,而是使用<http>元素进行配置。

2. 使用最小的<http>配置

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

这段配置表示:我们要保护应用程序中的所有URL,只有拥有ROLE_USER角色的用户才能访问。你可以使用多个<intercept- url>元素为不同URL的集合定义不同的访问需求,它们会被归入一个有序队列中,每次取出最先匹配的一个元素使用。 所以你必须把期望使用的匹配条件放到最上边。

3. 配置UserDetailsService来指定用户和权限

接下来,我们来配置一个UserDetailsService来指定用户和权限:

Xml代码
  1. <authentication-provider>  
  2.     <user-service>  
  3.       <user name="downpour" password="downpour" authorities="ROLE_USER, ROLE_ADMIN" />  
  4.       <user name="robbin" password="robbin" authorities="ROLE_USER" />  
  5.       <user name="QuakeWang" password="QuakeWang" authorities="ROLE_ADMIN" />  
  6.     </user-service>  
  7.   </authentication-provider>  
<authentication-provider> <user-service> <user name="downpour" password="downpour" authorities="ROLE_USER, ROLE_ADMIN" /> <user name="robbin" password="robbin" authorities="ROLE_USER" /> <user name="QuakeWang" password="QuakeWang" authorities="ROLE_ADMIN" /> </user-service> </authentication-provider>

在这里,downpour拥有ROLE_USER和ROLE_ADMIN的权限,robbin拥有ROLE_USER权限,QuakeWang拥有ROLE_ADMIN的权限

4. 小结

有了以上的配置,你已经可以跑简单的Spring Security的应用了。只不过在这里,我们还缺乏很多基本的元素,所以我们尚不能对上面的代码进行完整性测试。

如果你具备Acegi的知识,你会发现,有很多Acegi中的元素,在Spring Security中都没有了,这些元素包括:表单和基本登录选项、密码编码器、Remember-Me认证等等。

接下来,我们就来详细剖析一下Spring Security中的这些基本元素。

剖析基本配置元素

1. 有关auto-config属性

在上面用到的auto-config属性,其实是下面这些配置的缩写:

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>  
<http> <intercept-url pattern="/**" access="ROLE_USER" /> <form-login /> <anonymous /> <http-basic /> <logout /> <remember-me /> </http>

这些元素分别与登录认证,匿名认证,基本认证,注销处理和remember-me对应。 他们拥有各自的属性,可以改变他们的具体行为。

这样,我们在Acegi中所熟悉的元素又浮现在我们的面前。只是在这里,我们使用的是命名空间而已。

2. 与Acegi的比较

原文地址:https://www.cnblogs.com/danghuijian/p/4400748.html