当前位置: 首页 > news >正文

自己开发完整项目一、登录功能-05(动态权限控制)

一、上节回顾

在上一节中,我们介绍了如何通过数据库查询用户的权限,并对方法级别的接口使用注解的方式进行权限控制,之后通过用户携带的tocken进行解析权限,判断是否可以访问。


具体步骤:
1.在查询用户信息的时候将用户权限查询出来,并给前端返回一个tocken。

2.编写一个后端过滤:作用主要是通过自定义的jwt工具将tocken进行解析,将解析出来的权限信息告诉给springsecurity。

3.将自定义的过滤器加载到springsecurity中的过滤器链中。

4.在方法级别的接口上通过@PreAuthorize("hasAnyAuthority('qxgl')")  //需要的权限进行权限控制。

5.访问验证


那么上述方案有一个问题,在真实项目中,接口是非常多的,并且通过注解的方式进行权限控制的话,那么当接口权限发生变化的时候,改动量是非常大的,所以我们需要动态的设置接口权限。

二、动态权限的实现思路

1.每一个页面或者是按钮都有一个访问接口,那么我们就需要在menu表中增加访问接口的字段。

2.编写一个类实现AuthorizationManager接口,在这个接口中,我们需要查询出当前访问接口所需要的权限,然后根据当前用户的权限进行比对,如果有则放行。

2.在springsecurity的配制文件中,添加access配置并传入自定义类

 三、动态权限实现步骤

1..每一个页面或者是按钮都有一个访问接口,那么我们就需要在menu表中增加访问接口的字段。

CREATE TABLE `menu` (`id` int NOT NULL COMMENT 'id',`menu_name` varchar(255) DEFAULT NULL COMMENT '权限名称',`menu_tag` varchar(255) DEFAULT NULL COMMENT '权限标签',`parent_id` int DEFAULT NULL COMMENT '父id',`menu_type` int DEFAULT NULL COMMENT '权限类型(1:目录,2:菜单,3:按钮)',`is_deleted` int DEFAULT NULL COMMENT '是否删除',`path` varchar(255) DEFAULT NULL COMMENT '访问路径',PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb3;

2.编写一个类实现AuthorizationManager接口,在这个接口中,我们需要查询出当前访问接口所需要的权限,然后根据当前用户的权限进行比对,如果有则放行。

 

package com.ljy.myspringbootlogin.filter;/*** 这个类主要作用:实现动态权限* 1.实现AuthorizationManager* 2.重写其中的check()方法* 3.获取前端的请求路径(其中登录接口不需要认证)* 4.根据请求路径查询所需要的权限*//*** RequestAuthorizationContext  我们需要从这里取出请求接口路径*/import com.ljy.myspringbootlogin.model.MenuModel;
import com.ljy.myspringbootlogin.service.IMenuService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.security.authorization.AuthorizationDecision;
import org.springframework.security.authorization.AuthorizationManager;
import org.springframework.security.core.Authentication;
import org.springframework.security.core.GrantedAuthority;
import org.springframework.security.web.access.intercept.RequestAuthorizationContext;
import org.springframework.stereotype.Component;import javax.servlet.http.HttpServletRequest;
import java.util.Collection;
import java.util.function.Supplier;
import java.util.stream.Collectors;@Component
public class SpringSecurityAuyhorizationManager implements AuthorizationManager<RequestAuthorizationContext> {
@AutowiredIMenuService iMenuService;@Overridepublic AuthorizationDecision check(Supplier<Authentication> authentication, RequestAuthorizationContext requestAuthorizationContext) {//获取前端的请求路径HttpServletRequest request = requestAuthorizationContext.getRequest();String requestURI = request.getRequestURI();StringBuffer requestURL = request.getRequestURL();System.out.println("uri: "+requestURI);System.out.println("url: "+requestURL);//登录接口不需要认证if("/sys/login".equals(requestURI)){return new AuthorizationDecision(true);}//根据前端的请求路径查询menuMenuModel menuByPath = iMenuService.getMenuByPath(requestURI);if(menuByPath==null){return new AuthorizationDecision(false);}//获取所需要的权限String menuTag = menuByPath.getMenuTag();System.out.println("路径权限:"+menuTag);if(menuTag == null || menuTag.trim().equals("")){return new AuthorizationDecision(true);}//和用户的权限集合进行判断Collection<? extends GrantedAuthority> authorities = authentication.get().getAuthorities();for (GrantedAuthority authority : authorities) {String userParam = authority.getAuthority();System.out.println("用户权限:"+userParam);if(userParam.equals(menuTag)){return new AuthorizationDecision(true);}}return new AuthorizationDecision(false);}
}

3.在springsecurity的配置文件中配置

 

http.authorizeHttpRequests().antMatchers("/sys/**").permitAll()
//                .anyRequest().authenticated();.anyRequest().access(springSecurityAuyhorizationManager);   //动态实现权限

4.测试

 

相关文章:

  • 创建型设计模式-原型模式(prototype)- python实现
  • 微软AD替代方案统一管理Windows和信创电脑的登录认证与网络准入认证
  • ARM体系与架构
  • C++AVL树
  • 后端输出二进制数据,前端fetch接受二进制数据,并转化为字符输出
  • 智能体进化发展了一年,现在的RPA Agent迭代到什么程度了?
  • 【初出江湖】SOA 与微服务:哪个最适合您的业务?
  • 计算机网络-BFD实验配置
  • 测试:TestGRPCDiscovery
  • docker实战基础二(Docker基础命令)
  • zset使用lua实现取最高分数中的随机成员
  • 干货含源码!如何用Java后端操作Docker(命令行篇)
  • Redis在服务器启动的日志问题
  • 选择排序的动画展示与实现
  • Ubuntu20上的Qt程序连接Windows上的mssql服务器
  • ES6指北【2】—— 箭头函数
  • [分享]iOS开发 - 实现UITableView Plain SectionView和table不停留一起滑动
  • CentOS从零开始部署Nodejs项目
  • CentOS学习笔记 - 12. Nginx搭建Centos7.5远程repo
  • Dubbo 整合 Pinpoint 做分布式服务请求跟踪
  • Intervention/image 图片处理扩展包的安装和使用
  • js继承的实现方法
  • Netty源码解析1-Buffer
  • Selenium实战教程系列(二)---元素定位
  • spring boot 整合mybatis 无法输出sql的问题
  • uva 10370 Above Average
  • vue数据传递--我有特殊的实现技巧
  • Xmanager 远程桌面 CentOS 7
  • 工作中总结前端开发流程--vue项目
  • 深入体验bash on windows,在windows上搭建原生的linux开发环境,酷!
  • 应用生命周期终极 DevOps 工具包
  • media数据库操作,可以进行增删改查,实现回收站,隐私照片功能 SharedPreferences存储地址:
  • 如何用纯 CSS 创作一个菱形 loader 动画
  • 移动端高清、多屏适配方案
  • #基础#使用Jupyter进行Notebook的转换 .ipynb文件导出为.md文件
  • #我与Java虚拟机的故事#连载04:一本让自己没面子的书
  • (12)Linux 常见的三种进程状态
  • (vue)页面文件上传获取:action地址
  • (笔试题)分解质因式
  • (二十四)Flask之flask-session组件
  • (二十一)devops持续集成开发——使用jenkins的Docker Pipeline插件完成docker项目的pipeline流水线发布
  • (解决办法)ASP.NET导出Excel,打开时提示“您尝试打开文件'XXX.xls'的格式与文件扩展名指定文件不一致
  • (七)Knockout 创建自定义绑定
  • (数据大屏)(Hadoop)基于SSM框架的学院校友管理系统的设计与实现+文档
  • (转)Linux下编译安装log4cxx
  • (转)淘淘商城系列——使用Spring来管理Redis单机版和集群版
  • (转载)CentOS查看系统信息|CentOS查看命令
  • .gitignore文件—git忽略文件
  • .JPG图片,各种压缩率下的文件尺寸
  • .net websocket 获取http登录的用户_如何解密浏览器的登录密码?获取浏览器内用户信息?...
  • .NET学习教程二——.net基础定义+VS常用设置
  • @DependsOn:解析 Spring 中的依赖关系之艺术
  • @RequestParam详解
  • [ SNOI 2013 ] Quare
  • [CareerCup] 17.8 Contiguous Sequence with Largest Sum 连续子序列之和最大