8.1 理解Spring Security模块

8.1.1 理解模块

Security被分成以下11个模块

应用程序的类路径下至少要包含Core和Configuration两个模块

9.1.2 简单的安全配置

Spring Security借助Spring Filter来提高各种安全性功能
Spring Security配置

package test
import .......Configuration;
import .......EnableWebSecurity;
import .......WebSecurityConfigureAdapter;

@Configuration
// 启用Web安全性
@EnableWebSecurity
// 启用Web MVC安全性
@EnableWebMvcSecurity
public class SecurityConfig extends WebSecurityConfigureAdapter {

}

以上只是写了一个类扩展了WebSecurityConfigureAdapter类,但是要是启用还需要重载WebSecurityConfigureAdapter的三个方法。

虽然重载了以上的方法,但是问题依然存在,我们需要

  • 配置用户存储
  • 指定那些请求需要认证,哪些不需要,以及提供什么样的权限
  • 提供一个自定义的登陆页面,替代原来简单的默认登录页

8.2 选择查询用户详细信息的服务

8.2.1 使用基于内存的用户存储

扩展了WebSecurityConfigureAdapter,所以重载Configure方法,并以AuthenticationManageBuilder作为传入参数

package test.config

import org.springframework.context.annotation.Configuration;
import org.springframework.beans.annotation.Autowired;
import org.springframework.security.config.annotation.authentication.builders.AuthenticationManagerBuilder;
import org.springframework.security.config.annotation.web.builders.HttpSecurity;
import org.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter;
import org.springframework.security.config.annotation.web.servlet.configuration.EnableWebMvcSecurity;
@Configuration
@EnableWebMvcSecurity
public class SecurityConfig extends WebSecurityConfigurerAdapter {

	@Override
  	protected void configure(AuthenticationManageBuilder auth) throws Exception {
		auth.inMemoryAuthentication().withUser("user").password("password").roles("USER").and().withUser("admin").password("password").roles(""USER","ADMIN");
	}
}

代码解析:

  • configure()方法中使用类使用构造者风格的接口来构建认证配置。
  • 调用withUser()方法为内存用户存储添加新的用户,该方法的UserDetailsManagerConfigurer.UserDetailsBuilder,
  • 添加两个用户,user具有USER角色,admin具有USER和ADMIN角色。
  • roles方法是authorities方法的简写形式。

配置用户详细信息的方法

8.3 拦截请求

@Override
protected void configure(HttpSecurity http) throws Exception {
	http.authorizeRequests().antMatchers("/spitters/me").authenticated().antMatchers(HttpMethod.POST,"/spittles").authenticated().anyRequest().permitAll();
}

保护路径配置方法列表

8.3.1 强制通道安全性

```java
@Override
protected void configure(HttpSecurity http) throws Exception {
	http.authorizeRequests().antMatchers("/spitters/me").authenticated().antMatchers(HttpMethod.POST,"/spittles").authenticated().anyRequest().permitAll().and().requiresChannel().antMatchers("/spitters/form").requireSecure();<--需要HTTPS
	.requiresInsecure().antMatchers("/").requireInSecure();<--使用HTTP
}

8.3.2 防止跨站请求伪造

Spring Security通过一个同步token的方式来实现CSRF防护的功能。它将会拦截状态变化的请求(非GET、HEAD等的请求)并检查CSRF_token。如果请求中不包含CSRF token或者与服务器的token不符合则会失败,并抛出csrfException异常。意味着在所有表单中必须在一个"_csrf"的域中提交token

<form method="POST" th:action="@{/spittle}">
...
</form>

当然也可以在代码中取消该功能
.csrf.disable();即可

06-03 10:56