怎么实现对登录用户访问权限的拦截


怎么实现对登录用户访问权限的拦截

一. 自定义权限注解

package io.coderyeah.basic.annotation;import java.lang.annotation.*;/*** 自定义注解*/
@Target({ElementType.METHOD, ElementType.TYPE})
@Documented
@Retention(RetentionPolicy.RUNTIME)
public @interface PreAuthorize {String name();String sn();
}

二. 在接口方法上使用注解

/*** @param deptDTO 部门查询参数* @return Result*/
@PreAuthorize(name = "部门列表", sn = "department:list")
@LogAnnotation(module = "部门模块", operate = "分页查询部门列表")
@ApiOperation("查询部门列表")
@PostMapping("/list")
public Result list(@RequestBody(required = false) DeptDTO deptDTO) {return departmentService.list(deptDTO);
}

三. 登录拦截器

package io.coderyeah.basic.interceptor;import com.alibaba.fastjson.JSON;
import io.coderyeah.basic.annotation.PreAuthorize;
import io.coderyeah.basic.constant.Constants;
import io.coderyeah.org.mapper.EmployeeMapper;
import io.coderyeah.user.domain.LoginInfo;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.StringRedisTemplate;
import org.springframework.stereotype.Component;
import org.springframework.web.method.HandlerMethod;
import org.springframework.web.servlet.HandlerInterceptor;
import org.springframework.web.servlet.ModelAndView;import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.PrintWriter;
import java.util.List;
import java.util.concurrent.TimeUnit;@Component
public class LoginInterceptor implements HandlerInterceptor {@Autowiredprivate StringRedisTemplate stringRedisTemplate;@Autowiredprivate EmployeeMapper employeeMapper;@Overridepublic boolean preHandle(HttpServletRequest req, HttpServletResponse resp, Object handler) throws Exception {// 静态资源放行if (!(handler instanceof HandlerMethod)) {return true;}//1.获取tokenString token = req.getHeader("token");//3.如果有token,通过token获取redis的登录信息if (token != null) {String loginInfo = stringRedisTemplate.opsForValue().get(Constants.LOGIN_TOKEN + token); // LoginInfo对象if (loginInfo != null) {//登录成功,而且没有过期//5.如果登录信息不为null - 放行 + 刷新过期时间[重新添加到redis]stringRedisTemplate.opsForValue().set(Constants.LOGIN_TOKEN + token, loginInfo, 30, TimeUnit.MINUTES);final LoginInfo info = JSON.parseObject(loginInfo, LoginInfo.class);if (info.getType() == 1) {// 前端用户直接放行return true;}// 后端管理员 需要判断权限final HandlerMethod handlerMethod = (HandlerMethod) handler;// 获取访问的方法上的权限注解final PreAuthorize p = handlerMethod.getMethodAnnotation(PreAuthorize.class);if (null == p) {// 此方法上没有该注解直接放行 公用资源return true;}// 需要判断该登录用户是否具备此接口的操作权限final String sn = p.sn();// 查询该登录用户的所有权限集合List<String> ownPermissions = employeeMapper.getPermissionSnByLoginInfoId(info.getId());if (ownPermissions.contains(sn)) {// 包含该权限return true;}// 没有权限返回json信息给客户端resp.setCharacterEncoding("UTF-8");resp.setContentType("application/json;charset=utf-8");final PrintWriter writer = resp.getWriter();writer.print("{\"success\":false,\"message\":\"noPermission\"}");writer.close();return false;}}resp.setContentType("application/json;charset=UTF-8");resp.getWriter().println("{\"success\":false,\"message\":\"noLogin\"}");return false;}
}

四. 查询当前登录用户的所有权限涉及到多张表

<select id="getPermissionSnByLoginInfoId" resultType="java.lang.String">select tp.snfrom t_employee tejoin t_employee_role ter on te.id = ter.employee_idjoin t_role tr on ter.role_id = tr.idjoin t_role_permission trp on tr.id = trp.role_idjoin t_permission tp on tp.id = trp.permission_idwhere te.logininfo_id = #{id}
</select>

网络传输数据安全

五. 前端后置拦截器处理

//======================axios的后置拦截器【处理后台登录拦截的结果】====================//
axios.interceptors.response.use(res => {//后端响应的是没有登录的信息if (false === res.data.success && "noLogin" === res.data.message) {localStorage.removeItem("token");localStorage.removeItem("loginInfo");router.push({path: '/login'});}if (false === res.data.success && "noPermission" === res.data.message) {Message.info('您没有访问权限')}return res;
},error => {Promise.reject(error)
})
//======================axios的后置拦截器【处理后台登录拦截的结果】====================//
info('您没有访问权限')}return res;
},error => {Promise.reject(error)
})
//======================axios的后置拦截器【处理后台登录拦截的结果】====================//

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/52828.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

李彦宏一句“车水马龙”,中国AI的一幕天地宽广

“什么叫生成式&#xff1f;比如说&#xff0c;给我画一幅车水马龙的图片。这种东西&#xff0c;过去人们不觉得是人工智能应该做的事&#xff0c;现在可以做了。”5月18日&#xff0c;百度CEO李彦宏在天津举办的第七届世界智能大会上演讲时&#xff0c;说了这么一句话。 不了解…

比ChatGPT还厉害?Auto-GPT迅速走红,无需人类插手自主解决复杂任务,GitHub开源标星5万...

上一篇&#xff1a;16款ChatGPT工具&#xff0c;炸裂收藏&#xff01; Auto-GPT开源项目地址见文末 ChatGPT 之所以能风靡全球&#xff0c;很大程度上要归功于其简单的功能框架。作为一款 AI 聊天机器人&#xff0c;它唯一的作用就是生成令人信服的自然语言文本、顺畅回应用户的…

学术答辩PPT模板推荐

不管是学生还是老师&#xff0c;应该经常会需要学生答辩的PPT模板&#xff0c;今天给大家推荐PPT家园的学生答辩ppt模板。 学术答辩ppt模板 大气经典的排版画面&#xff0c;拼接的彩色又不会单调&#xff0c;非常适合正式答辩的通用PPT模板。 青春漫画风背景大学毕业答辩PPT…

学术答辩PPT模板分享

130套学术答辩PPT模板分享 链接: https://pan.baidu.com/s/1S7YbRlzOeyqwdc9ay5-DYA 提取码: irxg 动态PPT-49套 静态PPT-34套 答辩PPT-24套 精选动态PPT-21套

本科生毕业论文线上答辩流程(腾讯会议+WPS文字)

一、前言 今天&#xff08;6月4号&#xff09;刚刚参加毕业论文的答辩&#xff0c;因为学校不开学&#xff0c;只能线上答辩了。我们学校的答辩是在腾讯会议上进行的&#xff0c;然后我电脑没安装有office&#xff0c;所以用的是国产的WPS文字&#xff08;你也可以用office&am…

项目路演/课题答辩/毕业论文答辩PPT制作

本次博客分享一个具体的答辩PPT模板,只能以图片的形式展示。由于篇幅,没有全放,有需要的同学可以关注微信公众号找我要。 特别地,感谢冬令营期间各级领导的关心与帮助,感谢我的队友陪我熬过的夜,也谢谢那个她,这是一段十分难忘的经历! PPT演示视频(大屏观看更佳) 基…

微信小程序影视评论交流平台系统毕业设计毕设(6)开题答辩PPT

整个项目包含了&#xff1a;开题报告 开题报告PPT 任务书 中期报告 论文模板 答辩PPT等 项目源码 主要安介绍了系统在开发过程中所应用到的一些关键的技术&#xff0c;主要包括了前端小程序开发的MINA框架&#xff1b;后台开发java的框架springboot、模板引擎 thymeleaf…

毕业论文答辩开题报告PPT模板

模板介绍 一份高质量的PPT模板&#xff0c;可以让你在日常的工作中展示自我、脱颖而出、去赢得更多机会&#xff0c;今天小编分享一份精美的毕业论文答辩开题报告PPT模板 PPT模板名称&#xff1a;毕业论文答辩开题报告PPT模板&#xff0c;模板编号&#xff1a;P19955&#xff…

清华大学学术答辩通用PPT模板

模板介绍 精美PPT模板设计&#xff0c;清华大学学术答辩通用PPT模板。一套论文答辩幻灯片模板&#xff0c;内含蓝色,灰色多种配色&#xff0c;精美风格设计&#xff0c;动态播放效果&#xff0c;精美实用。 一份设计精美的PPT模板&#xff0c;可以让你在汇报演讲时脱颖而出。…

答辩PPT

怎么答辩&#xff1f;没答过。对毕业答辩这种客观存在着的事物&#xff0c;没有了解。那末&#xff0c;按什么路线去学呢&#xff1f;怎么把这种客观存在的事物反映到自己脑子里去呢&#xff1f; 按从共性到个性的路线去学吧。 先百度&#xff0c;调查一下情况&#xff0c;了…

从图片读取数据

为什么要从图片中读取数据呢&#xff1f;因为苦于没有实际准确的数据&#xff0c;只能用图瞎编了…呜呜呜 师哥给我推荐Origin。但是尼&#xff0c;我电脑没有Origin&#xff0c;也懒的装。于是给大家推荐一下几Mb的小软件GetData Graph Digitizer 公众号【自由小兵儿】回复【…

python opencv的imread方法无法读取图片

读取的路径、文件名只能带有英文数字及一些特定字符&#xff0c;不能带有中文、日文等字符&#xff01;&#xff01;&#xff01; 利用cv2.imread()读取文件夹中的四个图片文件&#xff1a; 读取’error副本.png’图片&#xff08;文件名带有中文&#xff09;&#xff0c;结…

Qt中opencv读取图片并显示原图及灰度图

目录 前言 配置 代码 结果 结语 前言 毕业几年了&#xff0c;没有做图像处理方面的工作&#xff0c;但一直对此保持着热爱&#xff0c;目前感觉有点陌生了&#xff0c;所以从头开始温习。《今日温习读取图片数据》 配置 新建Qt控制台程序&#xff0c;引入opencv库&#xf…

cv2.imread无法读取图片

问题 网上的回答都是路径有中文&#xff0c;或者斜杠和反斜杠引起的&#xff0c;但是我相对路径与绝对路径&#xff0c;去除中文都试过&#xff0c;全不行。明明同一路径下的图片都可以正常打开。 解决 后来发现PIL库可以正常打开&#xff0c;查看图片的参数发现其模式是P而不…

Python OpenCv读取.dat类型图片数据并显示

Python OpenCv读取.dat类型图片数据并显示 代码见下&#xff1a; import cv2 import numpy as np import matplotlib.pyplot as plt#加载nuc数据 col 256 #列 row 192 #行path "Image/DatFile/0001.dat" img np.fromfile(path,dtypenp.uint16)img1 img.resha…

python opencv 读取显示图片

读取图片路径有中文似乎会产生问题 import cv2 import numpy as np img cv2.imread(touxiang.jpg,cv2.IMREAD_GRAYSCALE)cv2.imshow(image, img)#第一个参数是窗口名称&#xff0c;是字符串。第二个参数是我们的图片 cv2.waitKey(0)#表示程序会无限制的等待用户的按键事件 cv…

使用QT显示OpenCV读取的图片

目录 1. 概述2. 实现2.1. 代码2.2. 解析3. 结果 1. 概述 OpenCV自带了一部分常用的GUI功能&#xff0c;但是更多的图像处理功能需要其他GUI框架来辅助实现&#xff0c;这里通过QT来显示OpenCV读取的图片。 2. 实现 在QtCreator中新建一个基于QMainWindow的应用&#xff1a…

OpenCV Mat读取和显示图片

一、从文件读取图像并显示 1. 程序 在基于VS2013搭建OpenCV开发环境这篇文章的最后给出了一个简单的Demo&#xff0c;这个例子跟本篇使用的例子是一样的。打开C IDE并创建一个新的项目&#xff0c;新建一个源文件&#xff0c;粘贴下面的代码&#xff1a; 1 2 3 4 5 6 7 8 9 10 …

opencv读取图片通道以及显示

使用cv2读取的图像的通道到是BGR通道&#xff0c;所以测试模型之前需要做BGR转RGB的操作。 imgcv2.imread(515.jpg) cv2.imshow("aa",img) cv2.waitKey(-1)显示结果&#xff1a; 显示结果是正常的。如果转为RGB后&#xff1f; import matplotlib.pyplot as plt im…

023期计算机开机号,大乐透2020023期开机号分析,历届023期开奖号码、及走势图...

大乐透2020023开机号 04 07 19 26 340211 前区分析&#xff1a; 和值&#xff1a;90 奇偶&#xff1a;2:3偶-奇-奇-偶-偶 前区推荐&#xff1a;03-05-11-13-16-26-27-28-32-35 后区推荐&#xff1a;03-04-10-11 (开机号码并非开奖号码&#xff0c;以上个人观点、仅供参考) 历史…