SpringBoot使用拦截器Interceptor实现统一角色权限校验
一、定义注解annotation
通用功能定义在tg-book-common中
我们最终实现的效果是:加了@Role注解以后,这个接口只有管理员才能访问,学生访问接口就会报错:无权限!
下面定义一个角色注解
,通过@Target 指定作用于方法
上。
@Target({ElementType.METHOD}) @Retention(RetentionPolicy.RUNTIME) public @interface Role { /** * 角色id数组,默认1-管理员 **/ int[] roleIds() default { 1 }; }
定义roleIds,是保留扩展性。若后面扩展出【校长】等其它角色,我们可以通过int数组来任意组合角色,只要拥有int数组中的任意角色id即可访问该接口。
二、拦截角色注解
1. 在拦截器哪里拦截?
显然,首先需要【用户身份认证】通过,然后再校验角色!即在AuthInterceptor的preHandle的保存至授权上下文之前:AuthContextInfo.setAuthInfo(authInfo);
@Override public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception { 。。。省略一大堆用户身份认证代码。。。 // TODO 校验角色:写在这! // 校验成功, 保存至认证上下文 AuthContextInfo.setAuthInfo(authInfo); return true; }
2. 如何拦截角色注解?
可以通过将handler转成HandlerMethod以后,通过getAnnotation来获取!
HandlerMethod handlerMethod = (HandlerMethod) handler; Role role = handlerMethod.getMethod().getAnnotation(Role.class); if (role != null) { // 走到这,说明方法上加了@Role }
3. 角色如何读取?
前2步以后,我们就拿到了当前登录的userId,也拿到了接口要求的roleIds数组,所以至少有两种方案:
- 可以通过userId去查一次MySQL,然后判断一下角色,这种我就不实现了,你可以自己去查询实现!
将roleId保存在token中!
,本文实现的是另一种方案,是为了扩展一下大家的思路,也就是不走MySQL查询的方案。
AuthContextInfo类中增加字段来承载角色:
private Integer roleId;
loginByPassword中将role设置到authContextInfo.roleId
authContextInfo.setRoleId(user.getRole());
接着在JwtTokenProvider中定义payload的自定义字段r:
// payload的自定义字段r private static final String CLAIM_ROLE = "r";
在JwtTokenProvider.create中将它保存到token的payload中:
// 自定义 role .withClaim(CLAIM_ROLE, authContextInfo.getRoleId())
在JwtTokenProvider.verify中将它从token中解析出来:
4. 最后做角色校验
拿到了authInfo.getRoleId(),还知道了接口方法要求的roleIds,判断逻辑太简单了吧~ 我简单写了一下,如下:
// 校验角色 HandlerMethod handlerMethod = (HandlerMethod) handler; Role role = handlerMethod.getMethod().getAnnotation(Role.class); if (role != null) { // 走到这,说明方法上加了@Role boolean isAdmin = false; for (int roleId : role.roleIds()) { if (authInfo.getRoleId().equals(roleId)) { isAdmin = true; break; } } if (!isAdmin) { log.info("[403]无权限, token={}", token); response.setStatus(HttpServletResponse.SC_FORBIDDEN); // 别忘了返回false return false; } }
三、应用:给管理员操作接口加注解
在实现了通用校验逻辑以后,接下来就是如何应用了!
其实就是:加@Role注解
下面对管理员录入和修改图书接口加了注解,其它接口同理~~
四、PostMan测试
使用role=0的账号调用管理员API,返回403!
使用管理员账号则会正常执行!就不做截图了!另外,别忘了提交Git!
以上就是SpringBoot使用拦截器Interceptor实现统一角色权限校验的详细内容,更多关于SpringBoot Interceptor统一角色权限校验的资料请关注脚本之家其它相关文章!
相关文章
java 装饰模式(Decorator Pattern)详解及实例代码
装饰器模式(Decorator Pattern)允许向一个现有的对象添加新的功能,同时又不改变其结构。这种类型的设计模式属于结构型模式,它是作为现有的类的一个包装2016-10-10spring boot之使用spring data jpa的自定义sql方式
这篇文章主要介绍了spring boot之使用spring data jpa的自定义sql方式,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教2021-12-12理解Java注解及Spring的@Autowired是如何实现的
今天通过本文带领大家学习注解的基础知识,学习Spring的@Autowired是怎么实现的,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友参考下吧2021-07-07
最新评论