@[TOC](spring security基本知识)##
spring security学习过程
文章目录
- 前言
- 一、spring security的核心类或接口
-
- SecurityContextHolder:
- Authentication:
- UserDetailsService:
- UserDetails:
- GrantedAuthority:
- 二、spring security主要过滤器(按顺序)
-
- SecurityContextPersistenceFilter(无法被覆盖)
- UsernamePasswordAuthenticationFilter
- BasicAuthenticationFilter
- ExceptionTranslationFilter(无法被覆盖)
- AbstractSecurityInterceptor(无法被覆盖)
- 总结
前言
记录一下自己大二暑假的学习内容
一、spring security的核心类或接口
SecurityContextHolder:
存储安全信息,使用localThread因此是线程安全,
Authentication:
SecurityContextHolder所存储安全信息的实例,可以在程序的任意一部分获取到该类实例,通常的使用实现类为UsernamePasswordAuthenticationToken,可以使用以下代码获Authentication实例
UserDetailsService:
向系统提供UserDeatils,只提供UserDeatil信息而不进行验证,验证过程有AuthenticationManager进行,可实现AuthenticationManager来自定义验证过程,可以使用UserServiceImpl类来实现该接口
UserDetails:
通过UserDetailsService提供必要的信息,用于构建Authentication对象,可以让User实体类来实现该接口,也可以使用类似代码创建实体类
User.builder()
.username(username)
.password(password)
.authorities(authorities)
.build();
GrantedAuthority:
授予到主体的权限,通常使用的实现类为SimpleGrantedAuthority,通常将role实体name属性作为作为权限字符串,可以类用类似代码创建GrantedAuthority集合的简单实现
roles.stream()
.map(Role::getName)
.map(SimpleGrantedAuthority::new)
.collect(Collectors.toList());
二、spring security主要过滤器(按顺序)
使用java代码的配置可以使用以下几种策略来添加自己的过滤器
http
//添加在某个过滤器前
.addFilterBefore(MyFilter, ExceptionTranslationFilter.class)
//添加在某个过滤器所在位置,如果是自定义的过滤器继承自spring security已有的过滤器
//通常使用这个方法
.addFilterAt(MyFilter, UsernamePasswordAuthenticationFilter.class)
//添加在某个过滤器后
.addFilterAfter(MyFilter, BasicAuthenticationFilter.class)
SecurityContextPersistenceFilter(无法被覆盖)
将每一个请求的上下文保存在SecurityContextHolder,并在会话结束后清理SecurityContextHolder。如果使用的session也会负责保存session信息
UsernamePasswordAuthenticationFilter
基于表单登录会使用该过滤器进行认证过程,开启表单登录后的登录请求会被该过滤器拦截,不处理具体的认证过程,认证过程将委托AuthenticationManager去进行,实现基于jwt的登录认证可以让自定义的过滤器继承该类
BasicAuthenticationFilter
官方文档的描述是负责处理http请求头部中的认证,因为token信息在http请求头中,所有可以继承该类来处理http请求头中的token信息
ExceptionTranslationFilter(无法被覆盖)
负责处理异常异常,由AuthenticationEntryPoint处理AuthenticationException以及匿名导致的AccessDeniedException,AccessDeniedHandler处理AccessDeniedException,可以分别实现这两个接口来进行自定义的处理,使用一下代码配置自定义的处理
http
//自定义失败时的处理
.exceptionHandling()
.authenticationEntryPoint(restfulAuthenticationEntryPoint)
.accessDeniedHandler(restfulAccessDeniedHandler)
.and();
AbstractSecurityInterceptor(无法被覆盖)
非登录的请求都会到处此过滤器,spring security主要的流程都会在此过滤器中进行,详细的内容在权限控制里面写,默认实现是FilterSecurityInterceptor
总结
spring security的一些基本知识,介绍一些在自定义spring security是常见的类或接口