本章内容
- 怎么自定义登录页
- 底层都怎么实现
- 如何注销?
- 注销底层源码简单分析
开干
- 去网上找个好看的前端, 改改
- 改改spring security配置
- 启动
几个红框框的地方注意下
@Configuration
public class SecurityConfig {
@Bean
public SecurityFilterChain securityFilterChain(HttpSecurity http) throws Exception {
http.authorizeRequests()
.antMatchers("/css/**", "/images/**", "/js/**").permitAll()
.anyRequest().authenticated();
http.formLogin(formLoginConfigurer -> {
formLoginConfigurer.loginPage("/login.html");
formLoginConfigurer.loginProcessingUrl("/doLogin");
formLoginConfigurer.defaultSuccessUrl("/hello", true);
formLoginConfigurer.permitAll();
});
http.csrf().disable();
return http.build();
}
}
server:
port: 8080
spring:
security:
user:
name: zhazha
password: "{noop}123456"
都什么意思?
为什么spring security知道我们自定义了?
我们设置的loginPage地址去哪了?
我们配置的loginProcessingUrl
在底层怎么玩?
前端已经用到这个地址了, 服务端只需要做个匹配器就好, 如果满足匹配器条件, 执行某个过滤器, 否则不执行过滤器
这个类可不得了 AbstractAuthenticationProcessingFilter
, 看他实现就知道了
也就是说, 只要客户端请求了/doLogin
, 就会被 AbstractAuthenticationProcessingFilter
过滤器匹配, 该过滤器就会拦截请求
又上面那个过滤器是抽象类, 最终一般都是
UsernamePasswordAuthenticationFilter
spring security的匹配器和过滤器之间的关系类似于spring gateway的 predicates和filter, 也就是 kv 结构, k负责匹配, v负责功能
最后的permitAll
呢?
默认是 true
几个地址都加入白名单
自定义表单属性
如果你前端请求传递给你的参数并不是 username 和 password 怎么办?
- 跟他说, 叫他改, 我喜欢, 约定大于配置
- 前端是老大, 我听他的
- 出去打一架
注销怎么拿捏?
// 注销
http.logout(logoutConfigurer -> {
logoutConfigurer.invalidateHttpSession(true);
logoutConfigurer.clearAuthentication(true);
logoutConfigurer.permitAll();
});
完事~~~ 本章结束
源码分析
核心接口:
注销的过滤器:
LogoutFilter