Loading [MathJax]/jax/output/CommonHTML/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >SpringBoot+拦截器+自定义异常+自定义注解+全局异常处理简单实现接口权限管理

SpringBoot+拦截器+自定义异常+自定义注解+全局异常处理简单实现接口权限管理

作者头像
Java旅途
发布于 2022-03-04 03:00:55
发布于 2022-03-04 03:00:55
96600
代码可运行
举报
文章被收录于专栏:Java旅途Java旅途
运行总次数:0
代码可运行

大家好,我是尧哥。

前言

提到权限管理这块肯定很多人第一想到的就是Springboot Security或者是Shiro安全框架,但本文介绍的并不是这两种,不是因为他们不好用,实在是自己太懒了,我觉得一个拦截器加上其他的一些处理就能满足项目的需求,我又何必去多用一个框架呢,这篇文章也不是去对比谁好谁坏,各位自行抉择。

我将权限管理分为三块:

1.资源权限:将url当做资源,可以给每个账号动态划分Url权限,访问不同的URl;

2.操作权限:将所有URL分为增、删、改、查4种操作权限,给用户分配对应的操作权限,如某个用户只有查操作权限那么他就无法做其他的操作;

3.角色权限:系统有多个角色,每个角色的权限都不同,如一个管理后台有着账号管理模块、商品模块等,为超级管理员的角色就可以看到所有模块并操作,而为售后的角色就只能看到商品模块,即使他知道账号管理模块下的URL也无权限操作。然后为用户设置角色就有对应的权限;

资源权限

1.静态资源准备

这里方便演示就不直接操作数据库了,对应的权限建表关系也很简单,这里直接建立静态的用户对应的URL关系。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
public class Constant {
    /**
     * 权限管理
     */
    public static Map<Integer,String[]> permission=new HashMap<>();
    static {
        String[] frist={"/url1","/url2","/url3","/url4","/url5","/url6","/url7"};//用户1所拥有的URL权限
        String[] second={"/url1","/url2","/url3","/url4","/url5"};//用户2所拥有的URL权限
        String[] third={"/url1","/url2","/url3"};//用户3所拥有的URL权限
        permission.put(1,frist);
        permission.put(2,second);
        permission.put(3,third);

    }
}

2.自定义一个异常,便于拦截抛出

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
public class APIException extends RuntimeException {
    private static final long serialVersionUID = 1L;
    private String msg;
    public APIException(String msg) {
        super(msg);
        this.msg = msg;
    }
}

3.全局异常处理

便于异常后返回统一规范的结果,正常应该是正常返回自定义Vo,但这里目标是为了演示结果,再加上各位应该都有自己的Vo类,所以这里就不用了

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
@RestControllerAdvice
public class WebExceptionControl {
    
    @ExceptionHandler(APIException.class)
    public String APIExceptionHandler(APIException e) {
        return e.getMessage();
    }
}

4.controller层

很简单创建对应的URL就好

5.拦截器创建

一般是要先验证token,后根据token取到用户对应信息,这里没有登录所以就直接在token里传对应用户的key值了

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
/**
 * 权限管理URL拦截器
 */
public class URLInterceptor implements HandlerInterceptor {

    // 预处理回调方法,在接口调用之前使用  true代表放行  false代表不放行
    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) {
        HttpServletRequest httpServletRequest = (HttpServletRequest) request;
        String token = httpServletRequest.getHeader("token");
        String requestURL = httpServletRequest.getRequestURI();
        //1.根据token判断用户是否登录
        if (token==null){   //正常情况下这里还需判断与redis中的token是否匹配
            // 如果没有token或者token不匹配, 直接抛出异常  提示未登录
            throw  new APIException("当前用户未登录");
        }
        //2.登录成功后 根据用户token中的信息获取到用户对应的URL权限集合
        String[] strings = Constant.permission.get(Integer.valueOf(token));
        boolean hasPermission = false;
        //3.再根据用户对应的URL集合去与当前请求的URL对比  有匹配的则放行  反之则抛出异常
        for (int i =0;i<strings.length;i++) {
            if (strings[i].equals(requestURL)){
                hasPermission = true;
                break;
            }
        }
        if (hasPermission){
            return true;
        }else {
            throw  new APIException("当前用户没有访问路径" + requestURL + "的权限");
        }
    }
}

6.将拦截器注入应用

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
@Configuration
public class WebMvcConfg implements WebMvcConfigurer {

    @Override
    public void addInterceptors(InterceptorRegistry registry) {
        //权限拦截器
        registry.addInterceptor(urlInterceptor()).addPathPatterns("/**");
    }
    @Bean
    public URLInterceptor urlInterceptor(){
        return new URLInterceptor();
    }
}

7.验证查看结果

分别在token中传入用户1-3的key,访问不同url就可以看到效果,如下

操作权限

1.和上面一样使用静态资源

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
public class Constant {
    /**
     * 权限管理
     */
    public static Map<Integer,String[]> permission=new HashMap<>();
    static {
        String[] frist={"insert","delete","select","update"};//用户1所拥有的操作权限
        String[] second={"insert","select","update"};//用户2所拥有的URL权限
        String[] third={"select"};//用户3所拥有的URL权限
        permission.put(1,frist);
        permission.put(2,second);
        permission.put(3,third);

    }
}

2.自定义注解

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
public @interface UrlAnnotation {
    /**
     * 操作类型(type):添加,删除,修改,插入
     * 
     */
    String type();
}

3.controller层

打上自定义的注解,代表对应方法是什么操作

4.修改一下之前的拦截器

添加对注解上面的操作类型的获取,并用type类型去对比判断

5.验证结果

其他都不变

角色权限

这里其实和上面的操作大同小异,我这里简单演示一下,以两个模块为例

1.静态对应关系

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
public class Constant {
    /**
     * 权限管理
     */
    public static Map<Integer,String[]> permission=new HashMap<>();
    static {
        String[] frist={"test","test1"};//用户1所拥有的模块权限  这里的test是模块URL入口  例如:test模块下所有URL都是/test/**
        String[] second={"test"};//用户2所拥有的模块权限
        permission.put(1,frist); //这里的1其实是用户对应ID为1的角色
        permission.put(2,second);//这个2同理

    }
}

2.修改controller

模拟两个模块

3.修改一下拦截器

4.结果测试

总结

其实用自定义的拦截器去做权限,不管是什么类型其实都大同小异,根据需求灵活的去处理才是最重要的,上面的静态权限变通一下,建立角色表、用户表、路径表以及对应关系,就很容易做出URL的动态权限配置了,灵活运用自定义注解搭配可以做到更细致。

< END >

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2022-01-13,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 Java旅途 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
shiro怎么进行权限管理_MySQL权限
大家好,我是架构君,一个会写代码吟诗的架构师。今天说一说shiro怎么进行权限管理_MySQL权限,希望能够帮助大家进步!!!
Java架构师必看
2022/08/14
7.9K0
java注解拦截_轻松实现java拦截器+自定义注解
本文将用简洁的代码构建一个springboot的拦截器。拦截器的使用很简单,定义一个自己的拦截器,向配置中添加一下就可以使用。为了方便,之后又引入了注解。
全栈程序员站长
2022/09/02
1.6K0
java注解拦截_轻松实现java拦截器+自定义注解
SpringBoot&Shiro实现权限管理
在本文中,我们使用RBAC(Role-Based Access Control,基于角色的访问控制)模型设计用户,角色和权限间的关系。简单地说,一个用户拥有若干角色,每一个角色拥有若干权限。这样,就构造成“用户-角色-权限”的授权模型。在这种模型中,用户与角色之间,角色与权限之间,一般者是多对多的关系。如下图所示:
用户7353950
2022/05/10
9210
SpringBoot&Shiro实现权限管理
自定义注解实现权限管理框架或其它功能扩充
在进行springMVC进行J2EE项目开发时,spring及第三方的如Shiro等为我们快速实现某个功能提供了注解标签,配置和使用都及其简单
肖哥哥
2019/02/22
7160
springboot shiro权限管理「建议收藏」
大家好,我是架构君,一个会写代码吟诗的架构师。今天说一说springboot shiro权限管理「建议收藏」,希望能够帮助大家进步!!!
Java架构师必看
2022/08/14
9480
springboot shiro权限管理「建议收藏」
【原创】006 | 搭上SpringBoot实战专车系列六:自定义拦截器
该趟专车是开往SpringBoot自定义拦截器的实战专车,拦截器通常用来实现请求鉴权,判断用户是否具有当前请求资源的权限,如果存在权限,则允许用户访问该资源,如果不存在权限,则不允许用户访问该资源的权限。
java进阶架构师
2021/02/22
5090
【原创】006 | 搭上SpringBoot实战专车系列六:自定义拦截器
自定义注解(拦截器实现)
拦截器是在面向切面编程中应用的,就是在你的service或者一个方法前调用一个方法,或者在方法后调用一个方法。是基于JAVA的反射机制
Java king
2023/02/21
6270
使用 Struct2 框架的拦截器 实现权限管理功能
使用 Struct2 框架的拦截器 实现权限管理功 一、项目基本介绍 二、项目环境搭建 三、项目结构搭建 3.1 前端 + 后端结构 3.2 前端主要页面 3.3 后端核心逻辑实现 (使用 struct2 拦截功能) 项目已经更新至:PowerManager 一、项目基本介绍 项目系统拥有三种用户类型 普通用户 (只具备信息查询的功能) 系统管理员 (只具备查询,添加,和修改的功能) 系统维护员 (具备所有功能,增删改查) 一些关键信息要隐藏 项目基本逻辑 具备最基本的登录功能 具备数据展示功能 项目侧
Gorit
2021/12/08
3970
使用 Struct2 框架的拦截器 实现权限管理功能
springBoot+mysql实现用户权限控制--系统框架搭建(四)
环境需求:springboot + mysql 5.7.16 + Lombok 1.18.12
用户9919783
2022/07/26
2560
SpringBoot权限管理实战:从入门到精通
在现代Web应用开发中,权限管理是不可或缺的核心功能。SpringBoot作为Java领域最流行的框架之一,提供了强大的安全支持。本文将带你全面了解如何在SpringBoot应用中实现完善的权限管理系统。
编程小白狼
2025/04/20
1350
SpringBoot 整合SpringSecurity示例实现前后分离权限注解+JWT登录认证
SpringSecurity是一个用于Java 企业级应用程序的安全框架,主要包含用户认证和用户授权两个方面.相比较Shiro而言,Security功能更加的强大,它可以很容易地扩展以满足更多安全控制方面的需求,但也相对它的学习成本会更高,两种框架各有利弊.实际开发中还是要根据业务和项目的需求来决定使用哪一种.
Rookie
2020/02/14
2.5K0
SpringBoot 整合SpringSecurity示例实现前后分离权限注解+JWT登录认证
22.<SpringBoot 统一功能处理(拦截器+统一返回结果+统一异常处理)>
postHandle()方法:目标方法执行后执行 afterCompletion()方法:视图渲染完毕后执行,最后执行(后端开发现在几乎不涉及视图,暂时不了解)
用户11288958
2024/11/21
4420
22.<SpringBoot 统一功能处理(拦截器+统一返回结果+统一异常处理)>
六. 接口请求自定义拦截器配置
前言 WebMvcConfigurer配置类其实是Spring内部的一种配置方式,采用JavaBean的形式来代替传统的xml配置文件形式进行针对框架个性化定制,可以自定义一些Handler,Interceptor,ViewResolver,MessageConverter。基于java-based方式的spring mvc配置,需要创建一个配置类并实现WebMvcConfigurer 接口。 继承WebMvcConfigurer类并实现api拦截 WebConfiguration 主要用于对除登
用户8988577
2022/12/27
5730
java权限拦截器
发布者:全栈程序员栈长,转载请注明出处:https://javaforall.cn/139497.html原文链接:https://javaforall.cn
全栈程序员站长
2022/09/02
7260
自定义配置拦截器
很多时候security默认提供的拦截器往往不够用于我们的日常开发,所以我们经常需要自己重写某些拦截器,达到实现开发的需求
用户11097514
2024/05/30
1680
SpringBoot中关于Shiro权限管理的整合使用
​1.加入Shiro的依赖包,实现自己的Realm类(通过继承AuthorizingRealm类);​
张哥编程
2024/12/19
1890
SpringSecurity权限管理,根据请求URL鉴权
SpringSecurity和Shiro是两大权限框架,前者属于Spring家族,功能比较强,重量级的存在,新手搞的时候可能会经常遇到坑。后者比较轻量级,上手相对比较简单。这两个我都写过权限管理的博客。
Java帮帮
2020/02/11
5.5K0
SpringSecurity权限管理,根据请求URL鉴权
【Spring底层原理高级进阶】轻松掌握 Spring MVC 的拦截器机制:深入理解 HandlerInterceptor 接口和其实现类的用法
拦截器在 Spring MVC 中扮演着重要的角色,用于拦截请求和响应的处理过程,并允许开发人员在请求进入控制器之前或离开控制器之后执行自定义的逻辑。它提供了一种在请求的不同生命周期阶段插入自定义代码的机制。
苏泽
2024/03/01
1K0
SpringMVC之拦截器和异常处理
Spring MVC中的拦截器(Interceptor),它主要用于拦截用户请求并作相应的处理。例如通过拦截器可以进行​权限验证​、记录​请求信息的日志​、​判断用户是否登录​等。要使用Spring MVC中的拦截器,就需要对拦截器类进行定义和配置。
张哥编程
2024/12/13
1460
SpringMVC之拦截器和异常处理
springboot 项目里面配置拦截器(提供代码)
对我们项目里面的借口做权限控制,或者登录控制,只有cookie信息,说明就是登录成功了,只有登录成功的才可以走对应的接口
一写代码就开心
2022/08/03
3550
推荐阅读
相关推荐
shiro怎么进行权限管理_MySQL权限
更多 >
领券
💥开发者 MCP广场重磅上线!
精选全网热门MCP server,让你的AI更好用 🚀
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验