SpringSecurity 本质是一个过滤器链,采用的是责任链设计模式。
org.springframework.security.web.session.DisableEncodeUrlFilter@2c9a6717,
org.springframework.security.web.session.ForceEagerSessionCreationFilter@7b3cde6f,
org.springframework.security.web.session.ForceEagerSessionCreationFilter@506aabf6,
// 将 Security 上下文与 Spring Web 中用于处理异步请求映射的 WebAsyncManager 进行集成。
org.springframework.security.web.context.request.async.WebAsyncManagerIntegrationFilter@6d091cad,
// 在每次请求处理之前将该请求相关的安全上下文信息加载到 SecurityContextHolder 中,然后在该次请求处理完成之后,将SecurityContextHolder
// 中关于这次请求的信息存储到一个“仓储”中,然后将SecurityContextHolder 中的信息清除,例如在 Session 中维护一个用户的安全信息就是这个过滤
// 器处理的。
org.springframework.security.web.context.SecurityContextPersistenceFilter@5cbd94b2,
// 用于将头信息加入响应中。
org.springframework.security.web.header.HeaderWriterFilter@3330f3ad,
// 用于处理退出登录。
org.springframework.security.web.authentication.logout.LogoutFilter@24a2e565,
// 自定义过滤器
com.tyr.security.support.authentication.sms.SmsCodeAuthenticationFilter@7c663eaf,
// 对 /login 的 POST 请求做拦截,校验表单中用户名,密码。
org.springframework.security.web.authentication.UsernamePasswordAuthenticationFilter@12a2585b,
// 自定义过滤器
com.tyr.security.support.authentication.jwt.JwtAuthenticationFilter@3bb5ceb,
// 自定义过滤器
com.tyr.security.support.authentication.mail.MailAuthenticationFilter@1e692555,
// 用来处理请求的缓存。
org.springframework.security.web.savedrequest.RequestCacheAwareFilter@6824b913,
// 主要是包装请求对象 request。
org.springframework.security.web.servletapi.SecurityContextHolderAwareRequestFilter@756aadfc,
// 当用户没有登录而直接访问资源时, 从 cookie 里找出用户的信息, 如果 Spring Security 能够识别出用户提供的 remember me cookie,
// 用户将不必填写用户名和密码, 而是直接登录进入系统,该过滤器默认不开启。
org.springframework.security.web.authentication.rememberme.RememberMeAuthenticationFilter@3b95a6db,
// 检测 SecurityContextHolder 中是否存在Authentication 对象,如果不存在为其提供一个匿名 Authentication。
org.springframework.security.web.authentication.AnonymousAuthenticationFilter@3ba0ae41,
// 管理 session 的过滤器
org.springframework.security.web.session.SessionManagementFilter@f425231,
// 异常过滤器,用来处理在认证授权过程中抛出的异常
org.springframework.security.web.access.ExceptionTranslationFilter@b46e103,
// 一个方法级的权限过滤器, 基本位于过滤链的最底部。
org.springframework.security.web.access.intercept.FilterSecurityInterceptor@3a2e9f5b
principal
credentials
details
authorities
authenticated
public interface UserDetailsService {/**根据用户名定位用户。在实际实现中,搜索可能区分大小写或不区分大小写,具体取决于实现实例的配置方式。在这种情况下, UserDetails 返回的 对象可能具有与实际请求的用户名不同的大小写。形参:username – 标识需要其数据的用户的用户名。返回值:完全填充的用户记录(从不 null)抛出:UsernameNotFoundException – 如果找不到用户或用户没有授权*/// UserDetails 系统默认的用户主体UserDetails loadUserByUsername(String username) throws UsernameNotFoundException;}
UserDetails
public interface UserDetails extends Serializable {// 表示获取登录用户所有权限Collection<? extends GrantedAuthority> getAuthorities();String getPassword();String getUsername();// 表示判断账户是否过期boolean isAccountNonExpired();// 表示判断账户是否被锁定boolean isAccountNonLocked();// 表示凭证{密码}是否过期boolean isCredentialsNonExpired();// 表示当前用户是否可用boolean isEnabled();
}
/*** Service interface for encoding passwords.** The preferred implementation is {@code BCryptPasswordEncoder}.** @author Keith Donald*/
public interface PasswordEncoder {// 表示把参数按照特定的解析规则进行解析String encode(CharSequence rawPassword);// 表示验证从存储中获取的编码密码与编码后提交的原始密码是否匹配。如果密码匹配,则返回 true;如果不匹配,则返回 false。// 第一个参数表示需要被解析的密码。第二个参数表示存储的密码。boolean matches(CharSequence rawPassword, String encodedPassword);// 表示如果解析的密码能够再次进行解析且达到更安全的结果则返回 true,否则返回false。默认返回 false。default boolean upgradeEncoding(String encodedPassword) {return false;}}
@EnableWebSecurity
类型的类,构成了 Spring Security 的配置。你知道的越多,你不知道的越多。