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 {

    @Autowired
private AdminUserService adminUserService; @Override
public 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;
} @Override
public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
// TODO
} @Override
public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
// TODO
}
}

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

@Configuration
public class MVCConfig extends WebMvcConfigurerAdapter {
@Bean
public SecurityInterceptor securityInterceptor() {
return new SecurityInterceptor();
} @Override
public 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 请求

springboot + 拦截器 + 注解 实现自定义权限验证的更多相关文章

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

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

  2. Spring MVC 使用拦截器优雅地实现权限验证功能

    在上一篇 SpringAOP 实现功能权限校验功能 中虽然用AOP通过抛异常,请求转发等勉强地实现了权限验证功能,但感觉不是那么完美,应该用拦截器来实现才是最佳的,因为拦截器就是用来拦截请求的,在请求 ...

  3. springmvc拦截器实现用户登录权限验证

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

  4. Struts2他们拦截器实例定义—登陆权限验证

    版本号:struts2.1.6 这种情况下实现功能:用户需要指定username登陆,进入相应的页面运行成功登陆作战,否则,它返回到着陆的登录页面,当直接进入操作页面(登陆访问页面后的能力)如果不同意 ...

  5. Spring-Boot:拦截器注解范例

    package com.example.aop; import java.lang.annotation.Documented; import java.lang.annotation.Element ...

  6. springboot + 注解 + 拦截器 + JWT 实现角色权限控制

    1.关于JWT,参考: (1)10分钟了解JSON Web令牌(JWT) (2)认识JWT (3)基于jwt的token验证 2.JWT的JAVA实现 Java中对JWT的支持可以考虑使用JJWT开源 ...

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

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

  8. Java结合SpringBoot拦截器实现简单的登录认证模块

    Java结合SpringBoot拦截器实现简单的登录认证模块 之前在做项目时需要实现一个简单的登录认证的功能,就寻思着使用Spring Boot的拦截器来实现,在此记录一下我的整个实现过程,源码见文章 ...

  9. SpringBoot拦截器及源码分析

    1.拦截器是什么 java里的拦截器(Interceptor)是动态拦截Action调用的对象,它提供了一种机制可以使开发者在一个Action执行的前后执行一段代码,也可以在一个Action执行前阻止 ...

随机推荐

  1. Windows环境下,python webdriver环境搭建

    最近刚开始学习selenium,这是我从虫师的<selenium2自动测试实战--基于Python语言>这本书上学到搭建环境的步骤,里面有加上我的一些总结,希望对大家有所帮助!   准备工 ...

  2. 【转载】Unity3D研究院之与根据动态的两个轨迹点绘制面详解

    大家应该知道3D世界中任何的面都是由三角形绘制完成的,因为任何无规则的集合图形都可以由三角形来组成.比如四边形,无论是正四边形还是无规则四边形都可以由两个三角形拼接而成.结合本文的标题大家仔细想想,如 ...

  3. leetcode 201. 数字范围按位与 解题报告

    给定范围 [m, n],其中 0 <= m <= n <= 2147483647,返回此范围内所有数字的按位与(包含 m, n 两端点). 示例 1: 输入: [5,7] 输出: 4 ...

  4. thinkphp3.2 学习笔记 基础篇

    环境要求:PHP5.3以上版本注意:PHP5.3DEV和php6不支持 目录结构 www WEB部署目录(或者子目录)├─index.php 入口文件├─README.md README文件├─App ...

  5. 【bzoj3561】DZY Loves Math VI 莫比乌斯反演

    题目描述 给定正整数n,m.求   输入 一行两个整数n,m. 输出 一个整数,为答案模1000000007后的值. 样例输入 5 4 样例输出 424 题解 莫比乌斯反演 (为了方便,以下公式默认$ ...

  6. [bzoj3065] 带插入区间第k小值 [重量平衡树套线段树]

    题面 传送门 思路 发现强制在线了...... 本来可以树套树解决的问题,现在外层不能使用线段树了,拿什么替代呢? 我们需要一种支持单点插入.下套数据结构.数据结构上传合并复杂度最多单log,不能旋转 ...

  7. BZOJ 3932: [CQOI2015]任务查询系统 | 主席树练习题

    题目: 洛谷也能评测 题解: De了好长时间BUG发现是自己sort前面有一行for没删,气死. 题目询问第x秒时候前k小的P值之和. 朴素想法: 我们可以把P值离散化,然后对于每个时刻建一棵定义域是 ...

  8. Codeforces Round #359 (Div. 2) B

    B. Little Robber Girl's Zoo time limit per test 2 seconds memory limit per test 256 megabytes input ...

  9. java泛型的一些解释

    public <A extends Annotation> A getAnnotation(Class<A> annotationClass)我们经常在帮助文档中看到这样的方法 ...

  10. bzoj 4407 于神之怒加强版 (反演+线性筛)

    于神之怒加强版 Time Limit: 80 Sec  Memory Limit: 512 MBSubmit: 1184  Solved: 535[Submit][Status][Discuss] D ...