引入SpringSecurity
SpringSecurity
实现原理是提供了一个过滤器链,其中主要过滤器如下所示:
认证流程示意:
授权过程
SpringSecurity
会使用
FilterSecurityInterceptor
来进行权限校验,在
FilterSecurityInterceptor
中
会从
SecurityContextHolder
中获取其中的
Authentication
,然后获取其中的权限信息。
在
SecurityConfig
上添加注解
@EnableGlobalMethodSecurity(prePostEnabled=true)
开启注解功
能。然后在方法上添加
@PreAuthorize
。
使用
引入依赖
<!--
假设在父类中已经确定版本
-->
<dependency>
<groupId>
org.springframework.boot
</groupId>
<artifactId>
spring-boot-starter-security
</artifactId>
</dependency>
测试时可以在配置文件中定义用户名和密码
spring:
security:
user:
name:
zsf
password:
pwd
如果不配置,系统将生成随机的密码。
禁用自动配置
如果要集成自定义的
security Provider
要从遗留的老项目升级到
SpringBoot
时 但大多数情况下我们不需要完全禁止自动配置,因为
Spring Security
允许我们添加自己的配置类,这样可以对自动配置的默认值进行调整,这样
一般更容易满足我们的需求。
@Configuration
@EnableWebSecurity
public class
BasicConfiguration
{
@Bean
public
InMemoryUserDetailsManager
userDetailsService
(PasswordEncoder
passwordEncoder)
{
UserDetails user = User.withUsername(
"user"
)
.password(passwordEncoder.encode(
"password"
))
.roles(
"USER"
)
.build();
UserDetails admin = User.withUsername(
"admin"
)
.password(passwordEncoder.encode(
"admin"
))
.roles(
"USER"
,
"ADMIN"
)
.build();
return new
InMemoryUserDetailsManager(user, admin);
}
@Bean
public
SecurityFilterChain
filterChain
(HttpSecurity http)
throws
Exception
{
http.authorizeRequests()
.anyRequest()
.authenticated()
.and()
.httpBasic();
return
http.build();
}
@Bean
public
PasswordEncoder
passwordEncoder
()
{
PasswordEncoder encoder =
PasswordEncoderFactories.createDelegatingPasswordEncoder();
return
encoder;
}
}
四种授权模式
1. 密码模式
使用场景:
1.
遗留项目升级为
oauth2
的适配方案
2.
内部系统
2. 授权码模式
常用
(
正宗
)
的授权模式
3. 简化模式
使用场景
1.
基于浏览器的应用
2.
不太安全
4. 客户端模式
使用场景
1.
与用户无关的应用
2.
服务器之间通信