security详解 + 项目搭建代码

Security框架

security是通过一个个过滤器来完成用户的认证授权,每个过滤器都有自己的职责,使得设计清晰明了,也容易学习。

主要对象介绍

1 .SecurityFilterChain

Security里面配置了各种各样的过滤器,将所有的Security过滤器组装在SecurityFilterChain中。

通过继承了Filter的DelegatingFilterProxy代理FilterChainProxy,FilterChainProxy中内部封装SecurityFilterChain,

再调用SecurityFilterChain中的过滤器

2. SecurityFilterChain默认的过滤器介绍

  • WebAsyncManagerIntegrationFilter

    此过滤器用于集成SecurityContext到Spring异步执行机制中的

  • SecurityContextPersistenceFilter

    首当其冲的一个过滤器,作用之重要,自不必多言。SecurityContextPersistenceFilter主要是使用SecurityContextRepository在session中保存或更新一个SecurityContext,并将SecurityContext给以后的过滤器使用,来为后续filter建立所需的上下文。SecurityContext中存储了当前用户的认证以及权限信息

  • HeaderWriterFilter

    向请求的Header中添加相应的信息,可在http标签内部使用security:headers来控制org.springframework.security.web.csrf.CsrfFiltercsrf又称跨域请求伪造,SpringSecurity会对所有post请求验证是否包含系统生成的csrf的token信息,如果不包含,则报错。起到防止csrf攻击的效果。

  • CsrfFilter

    crsf拦截处理,配合对应的security标签使用

  • LogoutFilter

    匹配URL为/logout的请求,实现用户退出,清除认证信息。

  • UsernamePasswordAuthenticationFilter

    登录认证器

    内部设置了登录的url,且只能是post请求,首先会匹配user是否为登录,然后验证Context中的

  • DefaultLoginPageGeneratingFilter

    针对login的url返回一个登录的页面,创建一个登录的页面

  • DefaultLogoutPageGeneratingFilter

    针对logout的url返回一个登录的页面,创建一个登录的页面

  • BasicAuthenticationFilter

    此过滤器会自动解析HTTP请求中头部名字为Authentication,且以Basic开头的头信息。

  • RequestCacheAwareFilter

    通过HttpSessionRequestCache内部维护了一个RequestCache,用于缓存

  • SecurityContextHolderAwareRequestFilter

    针对ServletRequest进行了一次包装,使得request具有更加丰富的API

  • AnonymousAuthenticationFilter

    当SecurityContextHolder中认证信息为空,则会创建一个匿名用户存入到SecurityContextHolder中。spring security为了兼容未登录的访问,也走了一套认证流程,只不过是一个匿名的身份。

    用户名为anonymousUser

    用户角色为ROLE_ANONYMOUS

  • SessionManagementFilter

    限制同一用户开启多个会话的数量

  • ExceptionTranslationFilter

    常转换过滤器位于整个springSecurityFilterChain的后方,用来转换整个链路中出现的异常

  • FilterSecurityInterceptor

    获取所配置资源访问的授权信息,根据SecurityContextHolder中存储的用户信息来决定其是否有权限。

注意当我们实现WebSecurityConfigurerAdapter类自定义配置Security,空配置会使得过滤器链缺少以下过滤器配置

CrsFilter、UsernameFilter、LoginPageGeneratingFilter、LogoutPageGeneratingFilter、BasicAuthticationFIlter

3. AuthenticationManager认证管理器

认证管理器,涉及token的生成、持久化、比对。

SecurityContextRepository

token的持久化对象,在spring-boot-starter-security中,是依托session机制来实现的。

该类在过滤器SecurityContextPersistenceFilter

该接口实现为HttpSessionSecurityContextRepository

很简单的就是从session中获取SecurityContext对象,没有登录的就创建个SecurityConext返回

SecurityContext

认证信息上下文,里面存着Authentication。也就是用户的信息,角色信息也全在这个对象里面。

SecurityContextHolder

获取上ContextContext的工具,也就是后面的执行方法都可以通过该工具获取SecurityContext对象了。例如在我们代码中获取登陆用户的信息,就直接通过该类获取,简单又方便。

ProviderManager

认证管理器提供者,被UsernamePasswordAuthenticationFilter封装,内部又分装认证方法的实现提供 AuthenticationProvider。

用来对比表单提供的用户信息与系统内的用户信息,来判断是否是用户本人。

AuthenticationProvider

认证方法实现,此类有两种实现DaoAuthenticationProvider、AnonymousAuthenticationProvider提供两种不同的Authentication

内部包含了UserDetails实体的检查,例如isLock isEnabled等

UserDetailsService

该接口只有一个方法,提供用户名,查询系统的用户信息。目的是为了与表单信息作比对。记住权限信息也是这个时候塞入的。

4. 鉴权对象

SecurityMetadataSource

该类主要方法是Collection getAttributes(Object var1)。通过入参获取访问的资源url,然后自己通过该url去寻找需要哪些权限字符,然后返回。重写需继承FilterInvocationSecurityMetadataSource

AccessDecisionManager

该类是决策器,判断接口是否放行,默认实现为AffirmativeBased。通过SecurityMetadataSource返回的权限字符,与认证信息中的权限信息对比,判断是否有该权限信息,有就放行,无则拒绝。认证信息即SecurityContext中的Authentication。

5.失败处理对象

security默认的失败对象,都是页面,不好解析,可以通过此方法实现自定义的返回结果。

AuthenticationEntryPoint

认证流程中出现AuthenticationException类型的异常,将通过此方法实现类回调

AccessDeniedHandler

授权出现AccessDeniedException类型的异常,将通过此方法实现回调

6.WebSecurityConfigurerAdapter

security核心配置类,主要有以下三个方法需要知道

@Configuration
@EnableWebSecurity
@EnableGlobalMethodSecurity(prePostEnabled = true, jsr250Enabled = true, securedEnabled = true)
public class SecurityConfigAdapterImpl extends WebSecurityConfigurerAdapter {


    //该方法用来放行静态资源
    public void configure(WebSecurity web) ;
    
    //该方法是用来配置过滤器,及其过滤器的属性
    protected void configure(HttpSecurity http)
    
    //该方法就是方会认证对象,但是认证对象没有注入容器,需重写该方法并添加@Bean注入spring容器
    public AuthenticationManager authenticationManagerBean()
}

Security认证授权流程

项目搭建源码+数据库

gittee源码 https://gitee.com/stone_1998/security_learn.git

如有不足,请纠正谢谢

posted @ 2022-11-11 17:15  站在巨人肩上的人  阅读(323)  评论(0编辑  收藏  举报