1, 获取Spring Security的Jar包 :从Spring网站下载页下载或者从Maven中央仓库下载。一个好办法是参考实例应用中包含的依赖库。css
2,项目模块:web
Core - spring-security-core.jar
包含了核心认证和权限控制类和接口, 运程支持和基本供应 API。使用 Spring Security 所必须的。支持单独运行的应用, 远程客户端,方法(服务层)安全和 JDBC用户供应。
Web - spring-security-web.jar
包含过滤器和对应的 web 安全架构代码。任何须要依赖 servlet API 的。 你将须要它,若是你须要 Spring Security Web 认证服务和基于 URL 的权限控制。
Config - spring-security-config.jar
包含安全命名控制解析代码(所以咱们不能直接把它用在你的应用中)。你须要它,若是使用了 Spring Security XML 命名控制来进行配置。
LDAP - spring-security-ldap.jar
LDAP 认证和实现代码,若是你须要使用 LDAP 认证或管理 LDAP 用户实体就是必须的。
ACL - spring-security-acl.jar
处理领域对象 ACL 实现。用来提供安全给特定的领域对象实例,在你的应用中。
CAS - spring-security-cas-client.jar
Spring Security 的 CAs 客户端集成。若是你但愿使用 Spring Security web 认证整合一个 CAS 单点登陆服务器。
OpenID - spring-security-openid.jar
OpenID web 认证 支持 。 用来 认证 用户 ,通 过 一个 外部 的 OpenID 服务。算法
3, 获取项目源代码spring
svn checkout http://acegisecurity.svn.sourceforge.net/svnroot/acegisecurity/spring-security/trunk/数据库
4,添加 security 命名空间安全
<beans xmlns="http://www.springframework.org/schema/beans" xmlns:security="http://www.springframework.org/schema/security" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.0.xsd http://www.springframework.org/schema/security http://www.springframework.org/schema/security/spring-security-3.0.xsd"></beans>
你会看到(在示例中)应用,咱们一般使用"security"做为默认的命名空间,而不是"beans",这意味着咱们能够省略全部 security 命名空间元素的前缀,使上下文更容易阅读。 若是你把应用上下文分割成单独的文件,让你的安全配置都放到其中一个文件里,这样更容易使用这种配置方法。服务器
<b:beans xmlns="http://www.springframework.org/schema/security" xmlns:b="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.0.xsd http://www.springframework.org/schema/security http://www.springframework.org/schema/security/spring-security-3.1.xsd">
5,开始使用安全命名空间配置架构
1) 配置 web.xmlapp
<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>
这是为 Spring Security 的 web 机制提供了一个调用钩子。这种状况下 , bean 的名字是"springSecurityFilterChain",这是由命名空间建立的用于处理 web 安全的一个内部的机制。 注意,你不该该本身使用这个 bean 的名字。jsp
2)编辑 applicationContext 文件 web 安全服务 是使用<http>元素配置的。 最小 <http>配置:
<http auto-config='true'> <intercept-url pattern="/**" access="ROLE_USER" /> </http>
这表示,咱们要保护应用程序中的全部 URL,只有拥有 ROLE_USER 角色的用户才能访问。
<intercept-url>元素定义了 pattern,用来匹配进入的请求 URL,使用一个 ant 路径语法
access 属性定义了请求匹配了指定模式时的需求。使用默认的配置, 这个通常是一个逗号分隔的角色队列,一个用户中的一个必须被容许访问请求
前缀“ROLE_”表示的是一个用户应该拥有的权限比对。
Spring Security 中的访问控制不限于简单角色的应用(所以,咱们使用不一样的前缀来区分不一样的安全属性)
Note:
你可使用多个<intercept-url>元素为不一样 URL 的集合定义不一样的访问需求,它们会被纳入一个有序队列中,每次取出最早匹配的一个元素使用。 因此你必须把指望使用的匹配条件放到最上边。你也能够添加一个 method 属性 来限制匹配一个特定的HTTP method(GET, POST, PUT 等等)。对于一个模式同时定义在定义了 method 和未定义 method 的状况,指定method 的匹配会无视顺序优先被使用。
咱们在上面用到的 auto-config 属性,实际上是下面这些配置的缩写: <http> <form-login /> <http-basic /> <logout /> </http>
<!-- 直接定义一些测试数据--> <authentication-manager> <!-- <authentication-provider>元素意味着用户信息将被认证管理用做处理认证请求。 你能够拥有多个<authentication-provider>元素来定义不一样的认证数据 --> <authentication-provider> <user-service> <!-- 能够从标准的properties文件中读取这些信息--> <user name="jimi" password="jimispassword" authorities="ROLE_USER, ROLE_ADMIN" /> <user name="bob" password="bobspassword" authorities="ROLE_USER" /> </user-service> </authentication-provider> </authentication-manager>
6, 表单和基本登陆选项
若是你想实现本身的登陆页面,你可使用
<http auto-config='true'> <intercept-url pattern="/login.jsp*" access="IS_AUTHENTICATED_ANONYMOUSLY"/> <intercept-url pattern="/**" access="ROLE_USER" /> <form-login login-page='/login.jsp'/> </http>
依旧可使用 auto-config。 这个 form-login 元素会覆盖默认的设置
咱们须要添加额外的 intercept-url 元素,指定用来作登陆的页面的 URL,这些 URL 应该能够被匿名访问。不然,这些请求会被/**部分拦截,它无法访问到登陆页面
若是你的登陆页面是被保护的。 也可能让全部的请求都匹配特定的模式,经过彻底的安全过滤器链:
<http auto-config='true'> <intercept-url pattern="/css/**" filters="none"/> <intercept-url pattern="/login.jsp*" filters="none"/> <intercept-url pattern="/**" access="ROLE_USER" /> <form-login login-page='/login.jsp'/> </http>
若是你但愿使用基本认证,代替表单登陆,能够把配置改成:
<http auto-config='true'> <intercept-url pattern="/**" access="ROLE_USER" /> <http-basic /> </http>
基自己份认证会被优先用到,在用户尝试访问一个受保护的资源时,用来提示用户登陆。在这种配置中,表单登陆依然是可用的
设置一个默认的提交登录目标
若是在进行表单登录以前,没有试图去访问一个被保护的资源,default-target-url就会起做用。 这是用户登录后会跳转到的 URL ,默认是 "/" 。你也能够把always-use-default-target 属性配置成"true",这样用户就会一直跳转到这一页(无论登录是“跳转过来的”仍是用户特定进行登录)。 若是你的系统一直须要用户从首页进入,就可使用它了,好比:
<http> <intercept-url pattern='/login.htm*' filters='none'/> <intercept-url pattern='/**' access='ROLE_USER' /> <form-login login-page='/login.htm' default-target url='/home.htm' always-use-default-target='true' /> </http>
7, 使用其余认证提供器
多数状况下,你会想把用户信息保存到数据库或者是 LDAP 服务器里
若是你自定义了一个 Spring Security 的 UserDetailsService 实现,在你的 application context 中名叫"myUserDetailsService",而后你可使用下面的验证。
<authentication-manager> <authentication-provider user-service-ref='myUserDetailsService'/> </authentication-manager>
若是你想用数据库,可使用下面的方式
<authentication-manager> <authentication-provider> <jdbc-user-service data-source-ref="securityDataSource"/> </authentication-provider> </authentication-manager>
这里的“securityDataSource”就是 DataSource bean 在 application context 里的名字,它指向了包含着 Spring Security 用户信息的表。
另外,你能够配置一个 Spring Security JdbcDaoImpl bean,使用 user-service-ref 属性指定:
<authentication-manager> <authentication-provider user-service-ref='myUserDetailsService'/> </authentication-manager> <beans:bean id="myUserDetailsService" class="org.springframework.security.core.userdetails.jdbc.JdbcDaoImpl"> <beans:property name="dataSource" ref="dataSource"/>
8,添加一个密码编码器
你的密码数据一般要使用一种散列算法进行编码。 使用<password-encoder>元素支持这个功能。 使用 SHA 加密密码,原始的认证供应器配置
<authentication-manager> <authentication-provider> <password-encoder hash="sha"/> <user-service> <user name="jimi" password="d7e6351eaa13189a5a3641bab846c8e8c69ba39f" authorities="ROLE_USER, ROLE_ADMIN" /> <user name="bob" password="4e7421b1b8765d8f9406d87e7cc6aa784c4ab97f" authorities="ROLE_USER" /> </user-service> </authentication-provider> </authentication-manager>
在使用散列密码时,用盐值防止字典攻击是个好主意,Spring Security 也支持这个功能。 理想状况下,你可能想为每一个用户随机生成一个盐值,不过,你可使用从UserDetailsService 读取出来的 UserDetails 对象中的属性。好比,使用 username属性,你能够这样用:
<password-encoder hash="sha"> <salt-source user-property="username"/> </password-encoder>
你能够经过 password-encoder 的 ref 属性,指定一个自定义的密码编码器 bean。这应该包含 application context 中一个 bean 的名字,它应该是 Spring Security 的PasswordEncoder 接口的一个实例