parent
231a548dca
commit
d636197346
@ -0,0 +1,148 @@
|
|||||||
|
注意:
|
||||||
|
|
||||||
|
1. 基于spring-boot-dependencies:2.7.7
|
||||||
|
2. 首先需要了解[springboot2.7升级](https://github.com/spring-projects/spring-boot/wiki/Spring-Boot-2.7-Release-Notes)
|
||||||
|
`Changes to Auto-configuration` 以后使用`autoconfigure`进行自动注入
|
||||||
|
|
||||||
|
# 启动
|
||||||
|
|
||||||
|
我们每次添加` <artifactId>spring-boot-starter-security</artifactId>`
|
||||||
|
,启动的时候启动日志会有一条类似
|
||||||
|
`Using generated security password: 1db8eb87-e2ee-4c72-88e7-9b85268c4430
|
||||||
|
|
||||||
|
This generated password is for development use only. Your security configuration must be updated before running your application in production.`
|
||||||
|
|
||||||
|
的日志.找到`UserDetailsServiceAutoConfiguration#InMemoryUserDetailsManager`类,它是springboot自动装配的.
|
||||||
|
|
||||||
|
下面这些都是springboot自动装配类,在`spring-boot-autoconfigure-2.7.7.jar`>META-INF>spring>
|
||||||
|
org.springframework.boot.autoconfigure.AutoConfiguration.imports中. 这些类就是security的全部了.
|
||||||
|
|
||||||
|
```imports
|
||||||
|
org.springframework.boot.autoconfigure.security.servlet.SecurityAutoConfiguration
|
||||||
|
org.springframework.boot.autoconfigure.security.servlet.UserDetailsServiceAutoConfiguration
|
||||||
|
org.springframework.boot.autoconfigure.security.servlet.SecurityFilterAutoConfiguration
|
||||||
|
org.springframework.boot.autoconfigure.security.reactive.ReactiveSecurityAutoConfiguration
|
||||||
|
org.springframework.boot.autoconfigure.security.reactive.ReactiveUserDetailsServiceAutoConfiguration
|
||||||
|
org.springframework.boot.autoconfigure.security.rsocket.RSocketSecurityAutoConfiguration
|
||||||
|
org.springframework.boot.autoconfigure.security.saml2.Saml2RelyingPartyAutoConfiguration
|
||||||
|
..........
|
||||||
|
org.springframework.boot.autoconfigure.security.oauth2.client.servlet.OAuth2ClientAutoConfiguration
|
||||||
|
org.springframework.boot.autoconfigure.security.oauth2.client.reactive.ReactiveOAuth2ClientAutoConfiguration
|
||||||
|
org.springframework.boot.autoconfigure.security.oauth2.resource.servlet.OAuth2ResourceServerAutoConfiguration
|
||||||
|
org.springframework.boot.autoconfigure.security.oauth2.resource.reactive.ReactiveOAuth2ResourceServerAutoConfiguration
|
||||||
|
```
|
||||||
|
|
||||||
|
## SecurityAutoConfiguration
|
||||||
|
|
||||||
|
```java
|
||||||
|
|
||||||
|
/**
|
||||||
|
* {@code EnableAutoConfiguration} for Spring Security.
|
||||||
|
*
|
||||||
|
* @author Dave Syer
|
||||||
|
* @author Andy Wilkinson
|
||||||
|
* @author Madhura Bhave
|
||||||
|
* @since 1.0.0
|
||||||
|
*/
|
||||||
|
@AutoConfiguration
|
||||||
|
@ConditionalOnClass(DefaultAuthenticationEventPublisher.class)
|
||||||
|
@EnableConfigurationProperties(SecurityProperties.class)
|
||||||
|
@Import({SpringBootWebSecurityConfiguration.class, SecurityDataConfiguration.class})
|
||||||
|
public class SecurityAutoConfiguration {
|
||||||
|
|
||||||
|
@Bean
|
||||||
|
@ConditionalOnMissingBean(AuthenticationEventPublisher.class)
|
||||||
|
public DefaultAuthenticationEventPublisher authenticationEventPublisher(ApplicationEventPublisher publisher) {
|
||||||
|
return new DefaultAuthenticationEventPublisher(publisher);
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
### @EnableConfigurationProperties(SecurityProperties.class)
|
||||||
|
|
||||||
|
这个是security的核心配置类`SecurityProperties`,里面能配置
|
||||||
|
`filter`: 过滤,`user` : 用户信息
|
||||||
|
|
||||||
|
`这个有个问题,filter是属于tomcat的,security中使用什么方式让filter变的有序的`
|
||||||
|
|
||||||
|
### @Import({ SpringBootWebSecurityConfiguration.class, SecurityDataConfiguration.class })
|
||||||
|
|
||||||
|
这里导入了2个类 `SpringBootWebSecurityConfiguration`和`SecurityDataConfiguration`,`SecurityDataConfiguration`是Spring
|
||||||
|
Security与Spring数据的集成,暂时不做讲解,重点是`SpringBootWebSecurityConfiguration`
|
||||||
|
|
||||||
|
#### SpringBootWebSecurityConfiguration
|
||||||
|
|
||||||
|
##### SecurityFilterChainConfiguration
|
||||||
|
|
||||||
|
其中第一个子类`SecurityFilterChainConfiguration`添加了`@ConditionalOnDefaultWebSecurity`,这个类有个注解
|
||||||
|
`@Conditional(DefaultWebSecurityCondition.class)`,而`DefaultWebSecurityCondition`类继承了`AllNestedConditions`
|
||||||
|
|
||||||
|
所以下面代码就是判断该类是否生效,如果不存在`SecurityFilterChain`和`WebSecurityConfigurerAdapter`
|
||||||
|
的bean,就生效.创建默认的`SecurityFilterChain`
|
||||||
|
|
||||||
|
```java
|
||||||
|
/**
|
||||||
|
* {@link Condition} for
|
||||||
|
* {@link ConditionalOnDefaultWebSecurity @ConditionalOnDefaultWebSecurity}.
|
||||||
|
*
|
||||||
|
* @author Phillip Webb
|
||||||
|
*/
|
||||||
|
class DefaultWebSecurityCondition extends AllNestedConditions {
|
||||||
|
|
||||||
|
DefaultWebSecurityCondition() {
|
||||||
|
super(ConfigurationPhase.REGISTER_BEAN);
|
||||||
|
}
|
||||||
|
|
||||||
|
@ConditionalOnClass({SecurityFilterChain.class, HttpSecurity.class})
|
||||||
|
static class Classes {
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
@ConditionalOnMissingBean({
|
||||||
|
org.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter.class,
|
||||||
|
SecurityFilterChain.class})
|
||||||
|
@SuppressWarnings("deprecation")
|
||||||
|
static class Beans {
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
##### ErrorPageSecurityFilterConfiguration
|
||||||
|
|
||||||
|
这是第二个子类,主要就是通过`FilterRegistrationBean`注入了一个`ErrorPageSecurityFilter`. 用于拦截错误调度,以确保对错误页面的授权访问。
|
||||||
|
|
||||||
|
|
||||||
|
##### WebSecurityEnablerConfiguration
|
||||||
|
这个类主要就是添加了`@EnableWebSecurity`注解,这个注解也很重要,后面跟`SecurityFilterChain`一样讲解
|
||||||
|
|
||||||
|
|
||||||
|
### DefaultAuthenticationEventPublisher
|
||||||
|
在类中还存在`SecurityAutoConfiguration`bean,这个是属于spring的发布订阅.改装一下,就是security的成功和失败事件,可以订阅失败后的一些处理,如日志打印等
|
||||||
|
|
||||||
|
|
||||||
|
```java
|
||||||
|
/**
|
||||||
|
* @author Luke Taylor
|
||||||
|
* @since 3.0
|
||||||
|
*/
|
||||||
|
public interface AuthenticationEventPublisher {
|
||||||
|
|
||||||
|
void publishAuthenticationSuccess(Authentication authentication);
|
||||||
|
|
||||||
|
void publishAuthenticationFailure(AuthenticationException exception, Authentication authentication);
|
||||||
|
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
## UserDetailsServiceAutoConfiguration
|
||||||
|
|
||||||
|
## SecurityFilterAutoConfiguration
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
Loading…
Reference in new issue