长沙哪家制作网站好,专业的西安免费做网站,wordpress仿唯品会,萧山市seo关键词排名文章目录 前言一、定义注解annotation二、拦截角色注解1. 在拦截器哪里拦截#xff1f;2. 如何拦截角色注解#xff1f;3. 角色如何读取?4. 最后做角色校验 三、应用#xff1a;给管理员操作接口加注解四、PostMan测试最后 前言
在【7.1】管理员图书录入和修改API#xf… 文章目录 前言一、定义注解annotation二、拦截角色注解1. 在拦截器哪里拦截2. 如何拦截角色注解3. 角色如何读取?4. 最后做角色校验 三、应用给管理员操作接口加注解四、PostMan测试最后 前言
在【7.1】管理员图书录入和修改API当时预告过并没有写【校验是否是管理员】的逻辑因为是通用逻辑会单写一篇来细讲那么今天就来安排
角色权限校验是保证接口安全必备的能力有权限才可以操作所以一般对于这种通用逻辑推荐不与主业务逻辑耦合那么怎么来解耦
在SpringBoot中过滤器、拦截器、切面都可以实现统一角色校验的功能解耦为了和【3-3 】用户身份认证的拦截器方案保持一致我们采用SpringBoot拦截器Interceptor实战统一角色权限校验 使用AOP的话你会实现吗文末投票不实名让我们有更多的互动吧~~ 一、定义注解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) {// 走到这说明方法上加了Roleboolean 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);// 别忘了返回falsereturn false;}
}三、应用给管理员操作接口加注解
在实现了通用校验逻辑以后接下来就是如何应用了 其实就是加Role注解 下面对管理员录入和修改图书接口加了注解其它接口同理~~ 四、PostMan测试
使用role0的账号调用管理员API返回403 使用管理员账号则会正常执行就不做截图了另外别忘了提交Git 最后
想要看更多实战好文章还是给大家推荐我的实战专栏–《基于SpringBootSpringCloudVue前后端分离项目实战》由我和 前端狗哥 合力打造的一款专栏可以让你从0到1快速拥有企业级规范的项目实战经验
具体的优势、规划、技术选型都可以在《开篇》试读
订阅专栏后可以添加我的微信我会为每一位用户进行针对性指导
另外别忘了关注我天罡gg 发布新文不容易错过 https://blog.csdn.net/scm_2008