SpringBoot 集成 SpringSecurity
实验环境
- IDEA
- Spring Boot:2.4.4
- Spring Security:2.4.4
- Gradle:6.8.3
spring security 简介
spring security 的核心功能主要包括:
* 认证
* 授权
* 攻击防护(防止伪造身份)
其核心就是一组过滤器链,项目启动后将会自动配置。
* UsernamePasswordAuthenticationFilter:表单登录Filter,判断是否是一个登录请求及是否包含 username 和 password;
* BasicAuthenticationFilter:用于认证用户的身份;
* … :其他认证过滤器;
* ExceptionTranslationFilter:会捕获抛出的错误,然后根据不同的认证方式进行信息的返回提示;
* FilterSecurityinterceptor:根据BrowserSecurityConfig 中的配置判定该请求是否能进行访问 rest 服务。
注意:紫色的过滤器可以配置是否生效,灰色的过滤器不可以配置是否生效。
Spring Security 简单集成体验
实验前提:已经使用 idea 新建 Spring Boot 工程,建构工具使用Gradle;
在 build.gradle 文件中 dependencies 中添加 Spring Security 依赖
implementation 'org.springframework.boot:spring-boot-starter-security'
只要加入依赖,项目的所有接口都会被自动保护起来;编写测试接口:
TestController.java@RestController public class TestController { @GetMapping("/test") public String Test() { return "test"; } }
启动项目,Spring Security 初始帐号为 user,控制台中会打印出 Spring Security 初始密码:
从浏览器发送请求访问 http://localhost:8080/test,服务端会返回 302 响应码,让客户端重定向到 http://localhost:8080/login 页面,用户在 http://localhost:8080/login 页面输入初始帐号密码登录,登陆成功之后,就会自动跳转到 http://localhost:8080/test 接口。
配置 Spring Security 帐号密码
配置文件配置用户名/密码
可以直接在 application.yml 文件中配置用户的基本信息:
spring:
profiles:
active: dev
security:
user:
name: admin
password: admin
配置完成后,重启项目,就可以使用这里配置的 admin/admin 登录了。
Java 配置类配置用户名/密码
可以在 Java 配置类中配置用户名/密码:
/**
* Spring Security 配置类
*
* @author zhaoff
*/
@Configuration
public class SecurityConfig extends WebSecurityConfigurerAdapter {
@Override
protected void configure(AuthenticationManagerBuilder auth) throws Exception {
// 在内存中配置用户 admin,密码为 admin
auth.inMemoryAuthentication()
.withUser("admin")
.roles("admin")
.password("$2a$10$A3Rt7Qhu6IAhtIsaC/hVXOgDiL289wOqEIhl1q7JtjEIGvMEv.iY6");
}
@Bean
PasswordEncoder passwordEncoder() {
return new BCryptPasswordEncoder();
}
}
重启项目,就可以使用在 configure 方法中配置的 admin/admin 登录了(用户的密码是加密之后的字符串)。
注意:从 Spring5 开始,强制要求密码要加密。Spring Security 中提供了 BCryptPasswordEncoder 密码编码工具,可以非常方便的实现密码的加密加盐,相同明文加密出来的结果总是不同,这样就不需要用户去额外保存盐的字段了。
集成完成!