目录
核心过滤器
FilterSecurityInterceptor
ExceptionTranslationFilter
UsernamePasswordAuthenticationFilter
BasicAuthenticationFilter
过滤器加载过程
重要接口
UserDetailsService接口
PasswordEncoder接口
springSecurity本质上就是一个过滤器链,由很多个过滤器组成,从启动是可以获取到过滤器链,当执行请求时就会执行相应的过滤器。
这些过滤器在系统启动时springboot会自动都配置完成
核心过滤器
FilterSecurityInterceptor
是一个方法级的权限过滤器, 基本位于过滤链的最底部
1.继承Filter方法
2.调用invoke方法
3.invoke方法
super.beforeInvocation(filterInvocation) 表示查看之前的 filter 是否通过。
filterInvocation.getChain().doFilter(filterInvocation.getRequest(), filterInvocation.getResponse());表示真正的调用后台的服务。
ExceptionTranslationFilter
异常过滤器,用来处理在认证授权过程中抛出的异常
核心方法doFilter:
UsernamePasswordAuthenticationFilter
对/login 的 POST 请求做拦截,校验表单中用户名,密码;
找到核心方法attemptAuthentication:
BasicAuthenticationFilter
主要用于处理httpBasic登录
先检查请求头中是否有basic开头Authentication的信息,如果有,会尝试进行base64解码,然后取出用户名和密码,尝试进行登录;如果没有,就回放过该请求,交给下一个过滤器处理
过滤器加载过程
1.使用SpringSecurty配置过滤器,也就是SpringBoot项目中自动配置的DelegatingFilterProxy
类
而在doFilter()
方法各种判断过后调用了initDelegate()
方法,在该方法里可以获取到FilterChainProxy
对象
2.在FilterChainProxy
也会进入doFilter()
方法,然后再进行各种判断后,会进入doFilterInternal()
方法
而在doFilterInternal()
方法中会将过滤器链中的过滤器加载进来,进行逐个执行
重要接口
UserDetailsService接口
自定义逻辑控制认证逻辑;查询数据库中的用户名和密码
返回值 UserDetails,这个类是系统默认的用户“主体”;
方法参数 username:表示用户名。此值是客户端表单传递过来的数据。默认情况下必须叫 username,否则无法接收
PasswordEncoder接口
用来数据加密;
实现类
BCryptPasswordEncoder 是 Spring Security 官方推荐的密码解析器,平时多使用这个解析器。
BCryptPasswordEncoder 是对 bcrypt 强散列方法的具体实现。是基于 Hash 算法实现的单向加密。可以通过 strength 控制加密强度,默认10