Spring Security 概述

本文将介绍 Spring Security,一个功能强大且高度可定制的身份验证访问控制框架。

一、介绍

  • Spring Security 是 Spring 家族的一员
  • Spring Security 提供了一套 Web 应用安全性的完整解决方案
  • Spring Security 功能强大且高度可定制
  • Spring Security 的两个核心功能是:
    • 身份验证
    • 访问控制
  • Spring Security 还支持攻击防护功能,包括:跨域保护、会话固定保护、安全请求头保护、HTTP 防火墙等

二、配置

1. 配置方式

Spring Security 通过配置类进行配置。

创建配置类,继承 WebSecurityConfigurerAdapter 类,使用 @EnableWebSecurity 注解即可。

2. WebSecurityConfigurerAdapter

WebSecurityConfigurerAdapter 类中有三个重载的 configure() 方法,如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
public abstract class WebSecurityConfigurerAdapter {

···

void configure(AuthenticationManagerBuilder auth) {

}

void configure(HttpSecurity http) {

}

void configure(WebSecurity web) {

}

···
}

其中,

  • configure(AuthenticationManagerBuilder auth):用于配置身份验证

    例如:

    • 配置账号、密码、角色
    • 配置验证方式
  • configure(HttpSecurity http):用于配置访问控制

    例如:

    • XX 资源需要 xx 权限才能访问
    • 配置登录功能
    • 配置登出功能
  • configure(WebSecurity web):用于对全局进行配置

    例如:

    • 设置调试模式
    • 设置静态资源
    • 设置自定义防火墙

3. 配置示例

如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
@EnableWebSecurity
public class SecurityConfiguration extends WebSecurityConfigurerAdapter {

// 配置身份验证
@Override
protected void configure(AuthenticationManagerBuilder auth) throws Exception {
// 在内存中创建用户
auth.inMemoryAuthentication()
.passwordEncoder(密码加密器)
.withUser(用户名)
.password(密码加密器.encode("密码"))
.roles(角色列表);

// 自定义验证类
auth.authenticationProvider(MyAuthenticationProvider);

// userDetails查询器
auth.userDetailsService(myUserDetailsService).passwordEncoder(密码加密器);
}

// 配置访问控制
@Override
protected void configure(HttpSecurity http) throws Exception {
// 访问控制
http
.authorizeRequests()
// 首页、登录页、错误页,不需要权限即可访问
.antMatchers("/", "/index", "/login", "/error").permitAll()
// "/admin" 及其以下所有路径,都需要 "ADMIN" 权限
.antMatchers("/admin/**").hasRole("ADMIN")
.withObjectPostProcessor(new ObjectPostProcessor<FilterSecurityInterceptor>() {
@Override
public <O extends FilterSecurityInterceptor> O postProcess(O object) {
// 自定义资源权限信息获取
object.setSecurityMetadataSource(mySecurityMetadataSource);
// 自定义资源的访问控制管理器
object.setAccessDecisionManager(myAccessDecisionManager);
return object;
}
});

// 登录
http
.formLogin()
.loginPage("/login_p")
.loginProcessingUrl("/login")
.permitAll()
.usernameParameter(自定义用户名参数)
.passwordParameter(自定义密码参数);

// 登出
http
.logout()
.logoutUrl("/logout")
.logoutSuccessUrl("/login");

// 异常处理
http
.exceptionHandling()
.authenticationEntryPoint(未登录异常处理类)
.accessDeniedHandler(未授权异常处理类);

// 禁用跨站请求保护
http
.csrf().disable();

// 开启跨域
http
.cors();
}

// 配置全局
@Override
public void configure(WebSecurity web) throws Exception {
// 忽略静态资源
web.ignoring().antMatchers("/static/**", "/favicon.ico");
}
}

三、身份验证

Spring Security 身份验证

四、访问控制

Spring Security 访问控制

参考