命名空间的配置包含如下几个部分
- Web/HTTP安全:设置过滤器和一些用于框架验证机制的服务Bean。
- 业务对象的保护 : 用于security服务层。
- AuthenticationManager : 权限管理器。处理从框架其他部分发来的权限请求。
- AccessDecisionManager:认证管理器 。 provides access decisions for web and method security。 系统会注册一个默认的认证管理器。
- AuthenticationProviders
- UserDetailsService
使用命名空间(WEB)
1. web.xml中添加过滤器
<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>
用户定义beans的时候不能将其命名为springSecurityFilterChain
。
2. 最精简的<http>配置
<http>
<intercept-url pattern="/**" access="hasRole('USER')" />
<form-login />
<logout />
</http>
- 应用中所有的url都收到保护,需要ROLE_USER这个角色才能访问。
- 用户使用表单进行登录,需要设计一个登出页面。
- <intercept-url>
pattern:访问路径
access:访问需求 - 可以使用多个<intercept-url>进行配置,但是系统会默认使用第一个匹配的需求,所以需要把最特殊匹配的放在最前面。
下面我们添加用户
<authentication-manager>
<authentication-provider>
<user-service>
<user name="jimi" password="jimispassword" authorities="ROLE_USER, ROLE_ADMIN" />
<user name="bob" password="bobspassword" authorities="ROLE_USER" />
</user-service>
</authentication-provider>
</authentication-manager>
- <http>元素负责创建FilterChainProxy和他所使用的过滤器beans。
- <authentication-manager>元素创建DaoAuthenticationProvider bean。
- <user-service>元素创建InMemoryDaoImpl。
- 所有的<authentication-provider>元素必须是 <authentication-manager>的子元素, <authentication-manager>创建了一个ProviderManager并且为他注册authentication providers。
3. Form和基本的登录选项
<http>
<intercept-url pattern="/login.jsp*" access="IS_AUTHENTICATED_ANONYMOUSLY"/>
<intercept-url pattern="/**" access="ROLE_USER" />
<form-login login-page='/login.jsp' />
</http>
所有匿名用户都可以进入登录页面,其他页面只有USER角色可以进入。 AuthenticatedVoter-->查看此类源码
** 可以用以下代码来完全绕开security过滤器**
<http pattern="/css/**" security="none"/>
<http pattern="/login.jsp*" security="none"/>
<http use-expressions="false">
<intercept-url pattern="/**" access="ROLE_USER" />
<form-login login-page='/login.jsp' />
</http>
如果<http>元素省略了pattern属性,那么他将对所有请求有效。
如果在<http>中设置路径来绕开security过滤器,那么这些路径中的内容不能再访问当前用户信息或者安全方法,如果还想在这些路径中访问,那么可以考虑放弃将security="none",改为采用access='IS_AUTHENTICATED_ANONYMOUSLY'。
如果要使用基本用户验证来代替表单验证,可以使用如下配置
<http use-expressions="false">
<intercept-url pattern="/**" access="ROLE_USER" />
<http-basic />
</http>
** 设置默认登录Post的目标**
<http pattern="/login.htm*" security="none"/>
<http use-expressions="false">
<intercept-url pattern='/**' access='ROLE_USER' />
<form-login login-page='/login.htm' default-target-url='/home.htm' always-use-default-target='true' />
</http>
- 如果登陆界面并不是因为用户要访问受保护资源而跳转过来的,那么用户登录成功后将进入default-target-url。
- 如果强制用户登录成功后进入default-target-url,那么可以设置always-use-default-target='true'
- 如果要特别细地配置登录成功后进入的目标可以通过设置 authentication-success-handlerref属性来代替 default-target-url,这个属性是类AuthenticationSuccessHandler的实例。
** 登出配置**
系统默认的登出链接是 /logout,如果想在用户登出时选择其他路径可以使用logout-url属性。
** 使用其他 Authentication Providers**
用户自定义UserDetailsService,然后实例化为 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的实例化名字,DataSource用来管理Spring Security的标准用户数据表。
我们也可以配置一个JdbcDaoImpl,然后用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"/>
</beans:bean>
也可以使用标准的AuthenticationProvider:
<authentication-manager>
<authentication-provider ref='myAuthenticationProvider' />
</authentication-manager>
myAuthenticationProvider为用户的一个bean的名字,这个bean需要实现 AuthenticationProvider接口
** 添加密码编码**
<beans:bean name="bcryptEncoder" class="org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder"/>
<authentication-manager>
<authentication-provider>
<password-encoder ref="bcryptEncoder"/>
<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>