springboot + 拦截器 + 注解 实现自定义权限验证
最近用到一种前端模板技术:jtwig,在权限控制上没有用springSecurity。因此用拦截器和注解结合实现了权限控制。

1.1 定义权限常量 PermissionConstants.java

public class PermissionConstants {/*** 管理员-产品列表查询*/public static final String ADMIN_PRODUCT_LIST = "admin_product_list";/*** 管理员-产品详情*/public static final String ADMIN_PRODUCT_DETAIL = "admin_product_detail";}

  • 权限也可以不定义为常量,看项目情况

1.2 定义权限的注解 RequiredPermission.java

@Target({ElementType.TYPE, ElementType.METHOD})
@Retention(RetentionPolicy.RUNTIME)
@Inherited
@Documented
public @interface RequiredPermission {String value();
}

  • ElementType.TYPE,ElementType.METHOD表示注解可以标记类和方法

1.3 权限拦截器 SecurityInterceptor.java

public class SecurityInterceptor implements HandlerInterceptor {@Autowiredprivate AdminUserService adminUserService;@Overridepublic boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {// 验证权限if (this.hasPermission(handler)) {return true;}//  null == request.getHeader("x-requested-with") TODO 暂时用这个来判断是否为ajax请求// 如果没有权限 则抛403异常 springboot会处理,跳转到 /error/403 页面response.sendError(HttpStatus.FORBIDDEN.value(), "无权限");return false;}/*** 是否有权限** @param handler* @return*/private boolean hasPermission(Object handler) {if (handler instanceof HandlerMethod) {HandlerMethod handlerMethod = (HandlerMethod) handler;// 获取方法上的注解RequiredPermission requiredPermission = handlerMethod.getMethod().getAnnotation(RequiredPermission.class);// 如果方法上的注解为空 则获取类的注解if (requiredPermission == null) {requiredPermission = handlerMethod.getMethod().getDeclaringClass().getAnnotation(RequiredPermission.class);}// 如果标记了注解,则判断权限if (requiredPermission != null && StringUtils.isNotBlank(requiredPermission.value())) {// redis或数据库 中获取该用户的权限信息 并判断是否有权限Set<String> permissionSet = adminUserService.getPermissionSet();if (CollectionUtils.isEmpty(permissionSet) ){return false;}return permissionSet.contains(requiredPermission.value());}}return true;}@Overridepublic void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {// TODO
    }@Overridepublic void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {// TODO
    }
}

1.4 拦截器注入的配置 MVCConfig.java

@Configuration
public class MVCConfig extends WebMvcConfigurerAdapter {@Beanpublic SecurityInterceptor securityInterceptor() {return new SecurityInterceptor();}@Overridepublic void addInterceptors(InterceptorRegistry registry) {registry.addInterceptor(securityInterceptor()).excludePathPatterns("/static/*").excludePathPatterns("/error").addPathPatterns("/**");}}

  • springboot中注入拦截器

1.5 ProductController.java

@Controller
@RequestMapping("/product")
// @PermissionConstants.ADMIN_PRODUCT_MANAGEMENT
public class ProductController {/*** 产品列表** @return*/@RequestMapping("/list")@RequiredPermission(PermissionConstants.ADMIN_PRODUCT_LIST) // 权限注解public String list() {// 省略产品列表查询逻辑return "/product/list";}/*** 产品详情** @return*/@RequestMapping("/detail")@RequiredPermission(PermissionConstants.ADMIN_PRODUCT_DETAIL) // 权限注解public String detail() {// 省略查询产品详情的逻辑return "/product/edit";}/*** 删除产品** @return*/@RequestMapping("/delete")public String delete() {// 省略删除产品的逻辑return "/product/list";}}

  • 如果没有标记权限注解,则不会验证该请求的权限,如/product/delete 请求

转载于:https://www.cnblogs.com/tianlong/p/10310372.html

springboot + 拦截器 + 注解 实现自定义权限验证相关推荐

  1. SpringBoot 拦截器和AOP自定义注解进行数据拦截实例

    声明:本文纯属个人随手笔记,如果对您有参考价值我十分开心,如果有存在错误,或者有更好的解决办法也麻烦您留言告诉我,大家共同成长,切勿恶言相. 欢迎加入资源共享QQ群:275343679,一起发现知识. ...

  2. struts2学习笔记--拦截器(Interceptor)和登录权限验证Demo

    理解 Interceptor拦截器类似于我们学过的过滤器,是可以在action执行前后执行的代码.是我们做web开发是经常使用的技术,比如权限控制,日志.我们也可以把多个interceptor连在一起 ...

  3. struts2自定义拦截器一——模拟登陆权限验证

    1.http://localhost:8083/struts2/user.jsp 表示用户已登陆,存放session对象 2.http://localhost:8083/struts2/quit.js ...

  4. Spring MVC拦截器实现用户登录权限验证案例

    本节将通过拦截器来完成一个用户登录权限验证的 Web 应用 springMVCDemo07,具体要求如下:只有成功登录的用户才能访问系统的主页面main.jsp,如果没有成功登录而直接访问主页面,则拦 ...

  5. java springmvc权限校验_springmvc拦截器实现用户登录权限验证

    实现用户登录权限验证 先看一下我的项目的目录,我是在intellij idea 上开发的 1.先创建一个User类 1 package cn.lzc.po; 2 3 public class User ...

  6. springboot拦截器实现管理员权限控制功能

    思路是这样的,在页面展示中,只显示权限内能使用的功能模块,进入每一个界面都需要拦截器对其进行权限验证,对不能使用的功能使用拦截器进行拦截. 这是主要设计到的三张数据库表格: 这是拦截器: packag ...

  7. 【SpringBoot】SpringBoot拦截器实战和 Servlet3.0自定义Filter、Listener

    =================6.SpringBoot拦截器实战和 Servlet3.0自定义Filter.Listener ============ 1.深入SpringBoot2.x过滤器Fi ...

  8. SpringBoot使用拦截器实现Restful URL权限拦截

    前言 RBAC 是基于角色的访问控制(Role-Based Access Control ).权限管理是在任何一个系统里都无法绕过的问题.没有权限控制管理的系统是非常不安全的. 在Spring框架体系 ...

  9. springboot拦截器 跳过_springboot创建拦截器过程图解

    springboot创建拦截器过程图解 这篇文章主要介绍了springboot创建拦截器过程图解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 一. ...

最新文章

  1. 元素对应到html源代码,【整理】用Chrome或Chromium查看百度首页中各元素的html源码...
  2. php 正则获取数字,php结合正则获取字符串中数字的几种方法
  3. 转:Excel导出问题(导出时不去掉前面的0)
  4. VUE初始化一个项目
  5. python-列表包字典的去重
  6. python基础——经营第一个项目,如何将python学得更6 ?
  7. ceph_OSD的添加删除
  8. 正则系列之手机号码正则
  9. TP5.1导出指定的多个日期的数据记录
  10. android用出生日期显示星座代码,根据出生日期自动取得星座的js代码
  11. 004-中国五个城市PM 2.5数据分析
  12. 推荐一批灵活好用的管理软件
  13. 格雷希尔G72L系列法兰式密封快速连接器的应用
  14. 计算机毕业设计SSM大学生校园社团管理系统【附源码数据库】
  15. ORACLE 年龄计算到月份
  16. CDQ分治——学习笔记
  17. 看看人家,才知道长期主义的好处!
  18. 除铜树脂CH-90NA电镀废水回收硫酸铜技术
  19. 企业cio(首席信息官)的职责
  20. 遇到问题--k8s--异常排查--pod重启在执行任务时自动重启的

热门文章

  1. 新手学python还是c语言_py和c语言究竟新手该学哪个?
  2. 5 加盐_洗花甲时,别只放盐了!老渔民教您一招,5分钟就搞定,太省事了
  3. mybatis对mysql if函数_Mybatis使用mysql函数if出现错误
  4. vmoptions默认配置_AndroidStudio基本配置
  5. 影响线型缩聚物分子量的因素_【CRPS】通过硼烷引发剂实现氧气引发的超高分子量聚合物的可控合成...
  6. 如何利用 notedown 完成 ipynb与markdown之间的格式转换?
  7. 神经网络学习中的SoftMax与交叉熵
  8. 霍尔开关YS1382检测速度 以及对 智能车竞赛节能组的影响
  9. 双轴机械臂串口控制命令开发与测试:STM32F103控制板,简易调试命令集合
  10. 智能车竞赛相关的教高司公函:公函[2005]201号文、教高司[2005]13号