单页网站在线制作,吉林省 网站建设,阿里云网站建设 部署与发布,12580黄页推广关键字#xff1a;AOP、JWT、自定义注解、责任链模式
一、Spring Security
Spring Security 想必大家并不陌生#xff0c;是 Spring 家族里的一个安全框架#xff0c;特别完善#xff0c;但学习成本比较大#xff0c;不少开发者都觉得#xff0c;这个框架“很重”
他的…关键字AOP、JWT、自定义注解、责任链模式
一、Spring Security
Spring Security 想必大家并不陌生是 Spring 家族里的一个安全框架特别完善但学习成本比较大不少开发者都觉得这个框架“很重”
他的认证授权的过程时使用的 api 和组件比较复杂但这不是主要的顾虑
并且他是基于过滤器实现的其过程抛出的异常并不会被全局异常处理器拦截通过 SpringSecurity 认证授权的请求才算进入我们的 Spring 环境下
但不得不说他确实有优点
对请求的一个 AOP 的统一处理但是好像没有专门的后置处理器可以通过添加过滤器的方式增加认证过程也对某些路由可添加授权过程框架的一些注解例如 PreAuthorize可以很方便的进行接口权限的设置
虽然它封装了很多现成的东西但其实一些自己去写也没什么大不了的还可以按照自己的想法去定制
我们可以学习它的优点去优化一下我们原本的认证授权架构
二、AOP JWT
通过全局拦截器拦截所有的请求请求携带访问令牌 JWT这里就不必多说了
三、自定义注解
自定义一个可以 Retention 为 RuntimeTarget 为 TYPE 或 METHOD 的注解
允许访问的角色是否需要认证是否需要授权
标注在 Controller 类才有用若加在类上则作用于所有方法若标注在方法上则以方法上的为准
意为此接口的拦截参数
/*** Created With Intellij IDEA* User: 马拉圈* Date: 2024-08-08* Time: 12:50* br /* permit: 用户必须是列表中的角色才能访问 br /* authenticate: 用户需不需要通过认证 br /* authorize: 用户需不需要通过授权 br /* 注意 br /* permit 若为 {}则代表谁都不能访问除非 authorize 为 false br /* 1. 不需要认证、不需要授权 ✅ br /* 2. 需要认证、需要授权 ✅ br /* 3. 需要认证、不需要授权 ✅ br /* 4. 不需要认证、需要授权 ❌必然失败 br /*/
Documented
Target({ElementType.TYPE, ElementType.METHOD})
Retention(RetentionPolicy.RUNTIME)
public interface Intercept {UserType[] permit() default {UserType.NORMAL_USER, UserType.MANAGER};boolean authenticate() default true; // 默认需要认证boolean authorize() default true; // 默认需要授权}
Slf4j
public class InterceptHelper {public static Intercept getIntercept(Class? clazz) {// 类上的 Intercept 为初步结果return clazz.isAnnotationPresent(Intercept.class) ? clazz.getAnnotation(Intercept.class) : null;}public static Intercept getIntercept(Method targetMethod) {// 获取目标方法所在的类Class? declaringClass targetMethod.getDeclaringClass();// 类上的 Intercept 为初步结果Intercept intercept getIntercept(declaringClass);// 方法上的 Intercept 为最终结果return targetMethod.isAnnotationPresent(Intercept.class) ? targetMethod.getAnnotation(Intercept.class) : intercept;}}四、责任链模式
责任链
抽象处理者具体处理者客户端我习惯是责任链的链头
设计出以下架构
前置初始化链 初始化日志变量、设置请求 id、请求 uri、请求方法便于全链路追踪根据配置文件对特定接口设置的拦截参数判断当前请求的接口是否被设置了特殊的拦截参数请求的接口如果存在目标方法则判断其方法上或者类上是否存在 Intercept 注解若存在则初始化拦截参数
若不存在拦截参数则代表该资源没有被开发者专门进行拦截的管理直接返回错误api 访问失败
前置认证链 是否忽略若 authenticate 参数为 false则直接忽略若认证未成功且未获取 jwt则尝试从 header 里获取 jwt若认证未成功且未获取 jwt则此时从 queryString 里获取 jwt若认证未成功则解析 jwt若成功解析出用户信息则存储到本地线程变量里若令牌即将过期则返回一个新的 jwt
若未认证成功则返回错误认证失败
前置授权链 是否武略是否强制拦截若未授权成功则获取当前用户的角色判断是否存在于拦截参数的允许访问的角色列表若存在则授权成功
若未授权成功则返回错误授权失败
后置链 清除日志变量、本地线程变量 在我们的架构中而一个责任链节点应该包含
拦截的路由执行的前置条件执行的代码
具体代码参考OKR-System4.0/src/main/java/cn/bitterfree/api/interceptor at main · CarefreeState/OKR-System4.0