《Spring Security3》第二章第二部分翻译
三步之内使我们的应用变得安全
尽管Spring Security的配置可能会很难,但是它的作者是相当为我们着想的,因为他们为我们提供了一种简单的机制来使用它很多的功能并可以此作为起点。以这个为起点,额外的配置能够实现应用的分层次详细的安全控制。
我们将从我们不安全的在线商店开始,并且使用三步操作将它变成一个拥有基本用户名和密码安全认证的站点。这个认证仅仅是为了阐述使用Spring Security使我们应用变得安全的步骤,所以你可能会发现这样的方式会有明显不足,这将会引领我们在以后的配置中不断进行改良。
实现Spring Security的XML配置文件
起点配置的第一步是创建一个XML的配置文件,用来描述所有需要的Spring Security组件,这些组件将会控制标准的web请求。
在WEB-INFO目录下建立一个名为dogstore-security.xml的XML文件。文件的内容如下所示:
<?xml version="1.0" encoding="UTF-8"?> <beans:beans xmlns="http://www.springframework.org/schema/security" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:beans="http://www.springframework.org/schema/beans" 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-3.0.xsd"> <http auto-config="true"> <intercept-url pattern="/*" access="ROLE_USER"/> </http> <authentication-manager alias="authenticationManager"> <authentication-provider> <user-service> <user authorities="ROLE_USER" name="guest" password="guest"/> </user-service> </authentication-provider> </authentication-manager> </beans:beans>这是我们应用中获得最小安全配置的唯一一个Spring Security配置文件。这个配置文件的格式使用了Spring Security特定的XML语法,一般称之为security命名空间。它在XML的命名空间中声明(http://www.springframework.org/schema/security)并与XML配置元素关联。我们将在在第六章:高级配置与扩展中讨论一种替代的配置方式,即使用传统的Spring Bean设置方式。
【讨厌Spring XML配置的用户可能会失望了,因为Spring Security没有像Spring那样提供可替代的注解机制。仔细想一下也是可以理解的,因为Spring Security关注的是整个系统而不是单个对象或类。但未来,我们可能能够在Spring MVC的控制器上使用安全注解,而不是在一个配置文件中指明URL模式!】
尽管在Spring Security中注解并不普遍,但正如你所预料的那样,对类或方法进行的配置是可以通过注解来完成的。我们将在第五章:精确的访问控制中介绍。
添加Spring DelegatingFilterProxy到web.xml文件
Spring Security对我们应用的影响是通过一系列的ServletRequest过滤器实现的(我们将会在介绍Spring Security架构的时候进行阐述)。可以把这些过滤器想成位于每个到我们应用的请求周围的具有安全功能的三明治。(这个比喻够新鲜,不过Spring Security的核心确实就是一系列介于真正请求之间的过滤器,译者注)。
Spring Security使用了o.s.web.filter.DelegatingFilterProxy这个servlet过滤器来包装所有的应用请求,从而保证它们是安全的。
【DelegatingFilterProxy实际上是Spring框架提供的,而不是安全特有的。这个过滤器一般在Spring构建的web应用工程中使用,并将依赖于servlet过滤器的Spring Bean与Servle过滤器的生命周期结合起来。】
通过在web.xml部署描述文件中添加如下的代码,就可以配置这样一个过滤器。这段代码位于Spring MVC的<servlet-mapping>之后:
<filter> <filter-name>springSecurityFilterChain</filter-name> <filterclass> org.springframework.web.filter.DelegatingFilterProxy </filter-class> </filter> <filter-mapping> <filter-name>springSecurityFilterChain</filter-name> <url-pattern>/*</url-pattern> </filter-mapping>我们所做的是使用一个ServletRequest过滤器并将它配置成处理匹配给定URL模式(/*)的请求。因为我们配置的这个通配符模式匹配所有的URL,所以这个过滤器将会应用于每个请求。
如果你有心的话,可能会发现这与我们的Spring Security配置文件即dogstore-security.xml没有任何的关系。为了实现这个,我们需要添加一个XML配置文件的应用到web应用的部署描述文件web.xml中。
添加Spring Security XML配置文件的应用到web.xml
取决于你如何配置你的Spring web应用,不知你是否已经在web.xml中有了对XML 配置文件的明确引用。Spring web的ContextLoaderListener的默认行为是寻找与你的Spring web servlet同名的XML配置文件。让我们看一下如何添加这个新的Spring Security XML配置文件到已经存在的JBCP Pet商店站点中。
首先,我们需要看一下这个应用是否使用了Spring MVC的自动查找XML配置文件的功能。我们看一下在web.xml中servlet的名字,以<servlet-name>原始进行标识:
<servlet> <servlet-name>dogstore</servlet-name> <servletclass> org.springframework.web.servlet.DispatcherServlet </servlet-class> <load-on-startup>1</load-on-startup> </servlet>Servlet的名字是(<servlet-name>)是dogstore,所以Spring的约定胜于配置(Convention
over Configuration,CoC)将会在WEB-INF目录下寻找名为dogstore-servelt.xml的配置文件。我们没有覆盖这种默认行为,你能在WEB-INF目录下找到这个文件,它包含了一些Spring MVC相关的配置。
【很多Spring Web Flow和Spring MVC的用户并不明白这些CoC规则是如何生效的以及Spring的代码中在何处声明了这些规则。o.s.web.context.support.XmlWebApplicationContext和它的父类是了解这些的一个很好的起点。JavaDoc在讲解基于Spring MVC框架的web工程的一些参数配置方面也做得不错。】
也可以声明额外的Spring ApplicationContext配置文件,它将会先于Spring MVC servle关联的配置文件加载。这通过Spring的o.s.web.context.ContextLoaderListener创建一个独立于Spring MVC ApplicationContext的另一个ApplicationContext来实现。这是通常的非Spring MVC beans配置的方式,也为Spring Security相关的配置提供了一个好地方。
在web应用的部署描述文件中,用来配置ContextLoaderListener的XML文件地址是在<context-param>元素中给出的:
<context-param> <param-name>contextConfigLocation</param-name> <param-value> /WEB-INF/dogstore-base.xml </param-value> </context-param>
dogstore-base.xml文件中包含了一些标准的Spring bean的配置,如数据源、服务层bean等。现在,我们能够添加一个包含Spring Security的XML配置文件了,下面是更新后的<context-param>元素:
<context-param> <param-name>contextConfigLocation</param-name> <param-value> /WEB-INF/dogstore-security.xml /WEB-INF/dogstore-base.xml </param-value> </context-param>
在我们添加完新的Spring Security配置文件到web部署文件并重启web工程后,尝试访问应用的首页地址:http://localhost:8080/JBCPPets/home.do,你将会看到如下的界面:
漂亮!我们已经使用Spring
Security在三步之内实现了一个简单的安全层。在这里,你可以使用guest作为用户名和密码进行登录。接着你将能够看到JBCP Pets应用的一个简单首页。
为了简便起见,本章的源码只包含了全部JBCP Pets整个应用的很小一部分(只有一个页面)。我们这么做是为了更简洁,同时也能让构建和部署应用时不必考虑我们将在后续章节中涉及到的附加功能。这也提供了一个很好的起点让你快速的体验参数的配置并重新部署以查看它们是否生效。
注意这些不足之处
到此为止,思考一下我们所做的事情。你可能已经意识到在产品化之前应用存在很多很明显的问题,这需要很多后续的工作和对Spring Security产品的了解。尝试列举一下在将这个实现安全功能的站点上线前还需要什么样的完善。
实现Spring Security起点级别的配置是相当迅速的,它已经提供了一个登录界面,用户名密码认证以及自动拦截我们在线商店的URL。但是在自动配置给我们提供的功能与我们的最终目标之间有很大的差距:
<!--[if !supportLists]-->l <!--[endif]-->我们将用户名、密码以及角色信息硬编码到XML配置文件中。你是否还记得我们添加的这部分XML内容:
<authentication-manager alias="authenticationManager"> <authentication-provider> <user-service> <user authorities="ROLE_USER" name="guest" password="guest"/> </user-service> </authentication-provider> </authentication-manager>你可以看到用户名和密码在这个文件中。你不可能愿意为每一个系统的用户都在这个XML文件中添加一个声明。要解决这个问题,你需要使用一个基于数据库的认证提供者(authentication provider)来替代它(我们将第四章:凭证安全存储完成它)。
<!--[if !supportLists]-->l <!--[endif]-->我们对所有的页面都进行了安全控制,包括一些潜在客户可能想匿名访问的界面。我们需要完善系统的角色以适应匿名的、认证过的以及管理权限的用户(这也将在第四章中讨论)。
<!--[if !supportLists]-->l <!--[endif]-->登录界面非常应用,但是它太基础了而且与我们JBCP商店风格一点也不一致。我们需要添加一个登录的form界面,并与我们应用的外观和风格一致(我们将在下一章解决这个问题)。
常见问题
很多用户在初次使用Spring Security时会遇到一些问题。我们列出了几个常见的问题和建议。我们希望你能够一直跟随着本书的讲解,运行我们示例代码。
<!--[if !supportLists]-->l <!--[endif]-->确保你的应用在添加Spring Security之前是可以编译和部署的。必要的时候看一些你所使用的servlet容器的入门级例子和文档。
<!--[if !supportLists]-->l <!--[endif]-->通常使用一个IDE如Eclipse会极大地简化你使用的servlet容器。不仅能够保证部署准确无误,它所提供的控制台日志也很易读可用来检查错误。你还可以在关键的位置添加断点,运行的时候会触发从而简化分析错误的过程。
<!--[if !supportLists]-->l <!--[endif]-->如果你的XML配置文件不正确,你会得到这样的提示信息(或类似的):org.xml.sax.SAXParseException: cvc-elt.1: Cannot find the declaration of element 'beans'。为实现Spring Security的正确配置需要各种各样的XML命名空间引用,这可能会使很多用户感到迷惑。重新检查一下这个例子,仔细查看一下schame声明的部分,并使用XML校验器来保证你没有不合法的XML。
<!--[if !supportLists]-->l <!--[endif]-->确保你所使用的Spring和Spring Security版本匹配,并确保没有你的应用中不存在没用的Spring jar包。
推荐阅读
-
MVC4制作网站教程第二章 部分用户功能实现代码
-
MVC4制作网站教程第二章 部分用户功能实现代码
-
Spring学习指南-第二章-Spring框架基础
-
ORACLEAUTOMATICSTORAGEMANAGEMENT翻译-第二章ASMinstance(1)
-
ORACLEAUTOMATICSTORAGEMANAGEMENT翻译-第二章ASMInstance(2)
-
ORACLEAUTOMATICSTORAGEMANAGEMENT翻译-第二章ASMInstance(3)
-
ORACLEAUTOMATICSTORAGEMANAGEMENT翻译-第二章ASMInstance(4)
-
Python基础——第二章 第二部分 列表及元组的方法
-
[书籍翻译] 《JavaScript并发编程》 第二章 JavaScript运行模型
-
【翻译】Spring Integration参考手册-第二章