- SpringSecurity认证的基本原理 & 认证的2种方式
- 过滤器链
- 认证方式
过滤器链SpringSecurity框架会默认自动地替我们将系统中的资源进行保护,每次访问资源的时候都必须经过一层身份的校验,如果通过了则重定向到我们输入的url中,否则访问是要被拒绝的。具体的实现主要是由一系列过滤器相互配合完成,也称之为过滤器链。
过滤器是一种典型的AOP思想。Spring Security默认加载15个过滤器, 但是随着配置可以增加或者删除一些过滤器。
| 默认加载的15个过滤器 | 说明 |
|---|---|
| org.springframework.security.web.context.request.async.WebAsyncManagerIntegrationFilter | 根据请求封装获取WebAsyncManager,从WebAsyncManager获取/注册的安全上下文可调用处理拦截器 |
| org.springframework.security.web.context.SecurityContextPersistenceFilter | SecurityContextPersistenceFilter主要是使用SecurityContextRepository在session中保存或更新一个SecurityContext,并将SecurityContext给以后的过滤器使用,来为后续filter建立所需的上下文。SecurityContext中存储了当前用户的认证以及权限信息 |
| org.springframework.security.web.header.HeaderWriterFilter | 向请求的Header中添加相应的信息,可在http标签内部使用security:headers来控制 |
| org.springframework.security.web.csrf.CsrfFilter | csrf又称跨域请求伪造,SpringSecurity会对所有post请求验证是否包含系统生成的csrf的token信息,如果不包含,则报错。起到防止csrf攻击的效果 |
| org.springframework.security.web.authentication.logout.LogoutFilter | 匹配URL为/logout的请求,实现用户退出,清除认证信息 |
| org.springframework.security.web.authentication.UsernamePasswordAuthenticationFilter | 表单认证操作全靠这个过滤器,默认匹配URL为/login且必须为POST请求 |
| org.springframework.security.web.authentication.ui.DefaultLoginPageGeneratingFilter | 如果没有在配置文件中指定认证页面,则由该过滤器生成一个默认认证页面 |
| org.springframework.security.web.authentication.ui.DefaultLogoutPageGeneratingFilter | 由此过滤器可以生产一个默认的退出登录页面 |
| org.springframework.security.web.authentication.www.BasicAuthenticationFilter | 此过滤器会自动解析HTTP请求中头部名字为Authentication且以Basic开头的头信息 |
| org.springframework.security.web.savedrequest.RequestCacheAwareFilter | 通过HttpSessionRequestCache内部维护了一个RequestCache,用于缓存HttpServletRequest |
| org.springframework.security.web.servletapi.SecurityContextHolderAwareRequestFilter | 针对ServletRequest进行了一次包装,使得request具有更加丰富的API |
| org.springframework.security.web.authentication.AnonymousAuthenticationFilter | 当SecurityContextHolder中认证信息为空,则会创建一个匿名用户存入到SecurityContextHolder中。Spring Security为了兼容未登录的访问,也走了一套认证流程,只不过是一个匿名的身份 |
| org.springframework.security.web.session.SessionManagementFilter | securityContextRepository限制同一用户开启多个会话的数量 |
| org.springframework.security.web.access.ExceptionTranslationFilter | 异常转换过滤器位于整个springSecurityFilterChain的后方,用来转换整个链路中出现的异常 |
| org.springframework.security.web.access.intercept.FilterSecurityInterceptor | 获取所配置资源访问的授权信息,根据SecurityContextHolder中存储的用户信息来决定其是否有权限 |
HttpBasic认证
- HttpBasic登录验证模式是Spring Security实现登录验证最简单的一种方式,也可以说是最简陋的一种方式。它的目的并不是保障登录验证的绝对安全,而是提供一种“防君子不防小人”的登录验证。
- 在使用的Spring Boot早期版本为1.X版本,依赖的Security 4.X版本,那么就无需任何配置,启动项目访问则会弹出默认的httpbasic认证。现在使用的是spring boot2.0以上版本(依赖Security5.X版本),HttpBasic不再是默认的验证模式,在spring security 5.x默认的验证模式已经是表单模式。
- HttpBasic模式要求传输的用户名密码使用base64模式进行加密。如果用户名是 “admin” ,密码是“admin”,则将字符串"admin:admin" 使用base64编码算法加密。加密结果可能是:YWtaW46YWRtaW4=。HttpBasic模式是非常简单又简陋的验证模式,base64的加密算法是可逆的,想破解并不难。
formLogin登录认证模式
Spring Security的HttpBasic模式,该模式比较简单,只是进行了通过携带Http的Header进行简单的登录验证,而且没有定制的登录页面,所以使用场景比较窄。对于一个完整的应用系统,与登录验证相关的页面都是高度定制化的,非常美观而且提供多种登录方式。这就需要SpringSecurity支持我们自己定制登录页面, spring boot2.0以上版本(依赖Security 5.X版本)默认会生成一个登录页面。



