尽管Spring Security的配置可能会很难,可是它的做者是至关为咱们着想的,由于他们为咱们提供了一种简单的机制来使用它不少的功能并能够此做为起点。以这个为起点,额外的配置可以实现应用的分层次详细的安全控制。web
咱们将从咱们不安全的在线商店开始,而且使用三步操做将它变成一个拥有基本用户名和密码安全认证的站点。这个认证仅仅是为了阐述使用Spring Security使咱们应用变得安全的步骤,因此你可能会发现这样的方式会有明显不足,这将会引领咱们在之后的配置中不断进行改良。spring
起点配置的第一步是建立一个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中注解并不广泛,但正如你所预料的那样,对类或方法进行的配置是能够经过注解来完成的。咱们将在第五章:精确的访问控制中介绍。app
Spring Security对咱们应用的影响是经过一系列的ServletRequest过滤器实现的(咱们将会在介绍Spring Security架构的时候进行阐述)。能够把这些过滤器想成位于每一个到咱们应用的请求周围的具备安全功能的三明治。(这个比喻够新鲜,不过Spring Security的核心确实就是一系列介于真正请求之间的过滤器,译者注)。框架
Spring Security使用了o.s.web.filter.DelegatingFilterProxy这个servlet过滤器来包装全部的应用请求,从而保证它们是安全的。ide
【DelegatingFilterProxy其实是Spring框架提供的,而不是安全特有的。这个过滤器通常在Spring构建的web应用工程中使用,并将依赖于servlet过滤器的Spring Bean与Servle过滤器的生命周期结合起来。】编码
经过在web.xml部署描述文件中添加以下的代码,就能够配置这样一个过滤器。这段代码位于Spring MVC的<servlet-mapping>以后:url
<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 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包。