基于AOP实现权限管理系统demo

简介:本文将介绍如何使用面向切面编程(AOP)技术实现一个简单的权限管理系统demo。我们将使用ssm框架作为基础,通过AOP来拦截和处理权限相关的操作。主要实现拦截操作。(如有需要,您可以自行从Gitee仓库中获取。仔细研究,主要用于学习AOP切面编程)

一、环境配置

引入Spring相关依赖

        在pom.xml文件中添加以下依赖:

        <!--AOP联盟--><dependency><groupId>aopalliance</groupId><artifactId>aopalliance</artifactId><version>1.0</version></dependency><!--Spring Aspects--><dependency><groupId>org.springframework</groupId><artifactId>spring-aspects</artifactId><version>5.0.2.RELEASE</version></dependency><!--aspectj--><dependency><groupId>org.aspectj</groupId><artifactId>aspectjweaver</artifactId><version>1.8.3</version></dependency><!-- mybatis核心包 --><dependency><groupId>org.mybatis</groupId><artifactId>mybatis</artifactId><version>${mybatis.version}</version></dependency><!-- mybatis/spring包 --><dependency><groupId>org.mybatis</groupId><artifactId>mybatis-spring</artifactId><version>1.2.2</version></dependency><!-- 导入Mysql数据库链接jar包 --><dependency><groupId>mysql</groupId><artifactId>mysql-connector-java</artifactId><version>5.1.36</version></dependency>

二、定义用户实体类

public class User {private Integer id;private String userTel;private String userPsw;private String userName;private String userSex;private String userBirthday;private String userAddress;private String userIdName;private String userIDNum;// 省略getter和setter方法
}

三、定义权限类

public class SysPerssion {private Integer id;private String permissionName;private String permissionUrl;private String permissionStr;//省略getter和setter方法
}

四、创建自定义注解

import java.lang.annotation.*;@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
public @interface RequiresPermission {String[] value();
}

 五、创建权限切面类

        最主要的类(要在对应的xml文件中开启aop自动配置)

import com.javen.model.SysPerssion;
import com.javen.service.SysPermissionService;
import com.javen.util.UserInfo;
import org.aspectj.lang.JoinPoint;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Before;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;import javax.servlet.http.Cookie;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpSession;
import java.util.Arrays;
import java.util.List;@Component
@Aspect
public class PermissionAspect {@Autowiredprivate SysPermissionService sysPermissionService;@Autowiredprivate HttpSession httpSession;@Autowiredprivate HttpServletRequest request;/*** 根据Cookie获取userId*/@Before("@annotation(requiresPermission)")public void checkPermission(JoinPoint joinPoint, RequiresPermission requiresPermission) {// 从数据库中获取当前用户的权限,判断是否包含注解指定的权限Integer userId = null;Cookie[] cookies = request.getCookies();for(Cookie cookie : cookies){userId = UserInfo.getInfo(cookie.getValue());}// 根据用户ID从数据库获取用户的所有权限List<SysPerssion> userPermissions =  sysPermissionService.getAllPermissionsById(userId);System.out.println(userPermissions);// 获取具体权限String[] requiredPermissions = requiresPermission.value();// 进行权限匹配操作,判断用户是否具有执行操作所需的权限boolean hasPermission = Arrays.stream(requiredPermissions).anyMatch(requiredPermission -> userPermissions.stream().anyMatch(permission -> permission.getPermissionStr().equals(requiredPermission)));if (!hasPermission) {// 如果权限不足,可以抛出异常或执行其他相应的处理逻辑throw new SecurityException("权限不足");}}
}

 六、编写登录接口

@Controller  
@RequestMapping("/user")
public class UserController {  private static Logger log=LoggerFactory.getLogger(UserController.class);@Resource  private IUserService userService;     @Resourceprivate HttpSession session;@RequestMapping(value="/login")public String test2(User user, Model model, HttpServletResponse response) throws Exception{User u = userService.login(user);if(u == null){// todo}else{// 账户密码正确Random random = new Random();int i = random.nextInt();Cookie cookie = new Cookie("userInfo",i + "abc");cookie.setPath("/");UserInfo.putInfo(i + "abc",user.getId());response.addCookie(cookie);log.info("cookie 执行:" + i + "abc");session.setAttribute(i+"abc",user.getId());}log.info(user.toString());model.addAttribute("user", user);return "index";}
}  

七、编写测试接口类

在要拦截的接口上方添加  @RequiresPermission() 注解

@Controller
@RequestMapping("test")
public class TestController {@Autowiredprivate HttpSession httpSession;@RequestMapping("index")@RequiresPermission({"select"})public String index(HttpServletRequest request){//测试获取cookieCookie[] cookies = request.getCookies();for(Cookie cookie : cookies){System.out.println(cookie.getName() + "=" + cookie.getValue());}Enumeration<String> attributeNames = httpSession.getAttributeNames();while (attributeNames.hasMoreElements()){String s = attributeNames.nextElement();System.out.println(s);System.out.println("getId="+httpSession.getAttribute(s));}return "index";}
}

具体数据库数据(数据库内容过于简单,真实案例比这复杂仅供参考)

 

 gitee仓库分享

 gitee仓库地址:WWangs/aop实现权限

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

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

相关文章

嵌入式-stm32-基于HAL库的感应开关盖垃圾桶项目(开源)

嵌入式-stm32-感应开关盖垃圾桶项目&#xff08;开源&#xff09; 网盘资料 《嵌入式-stm32-基于HAL库的感应开关盖垃圾桶项目&#xff08;开源&#xff09;》 目录 一&#xff1a;项目概述 二&#xff1a;材料准备 三&#xff1a;细节分析&#xff08;重点&#xff09; 四&…

Git 对项目更新的时候提示错误 repository not owned by current user

遇到 Git 提示的错误信息为&#xff1a;repository not owned by current user 上图显示的是错误的信息。 问题和解决 出现上面错误信息的原因是当前文件夹的权限和 Git 的执行权限不一直导致的。 我们的问题是我们希望在网盘上使用 Git 更新克隆后的代码&#xff0c;但登录…

快速、准确地检测和分类病毒序列分析工具 ViralCC的介绍和详细使用方法,fudai shiyong ijaoben

介绍 viralcc是一个基因组病毒分析工具&#xff0c;可以用于快速、准确地检测和分类病毒序列。 github&#xff1a;dyxstat/ViralCC: ViralCC: leveraging metagenomic proximity-ligation to retrieve complete viral genomes (github.com) Instruction of reproducing resul…

Ajax基础入门_Ajax概述,同步与异步,Axios的使用,JSON数据及FastJSON的使用

Ajax 文章目录 Ajax1 概述2 作用3 同步和异步3.1 同步3.2 异步 4 代码编写4.1 服务端4.2 客户端 5 Axios5.1 使用5.2 代码5.2.1 前端5.2.2 后端 5.3 请求方法别名 6 JSON6.1 概述6.2 JSON 基础语法6.2.1 定义格式6.2.2 js 对象与JSON的转换 6.3 发送异步请求携带参数6.4 JSON串…

Focal Loss

1、样本不均衡的 问题 与 方案 Focal loss 用于解决上述 样本不均衡的问题 : \quad 1、正负样本数量不均衡 \quad 2、易分类的样本和难分类的样本数量不均衡

Linux内存管理:(五)反向映射RMAP

文章说明&#xff1a; Linux内核版本&#xff1a;5.0 架构&#xff1a;ARM64 参考资料及图片来源&#xff1a;《奔跑吧Linux内核》 Linux 5.0内核源码注释仓库地址&#xff1a; zhangzihengya/LinuxSourceCode_v5.0_study (github.com) 1. 前置知识&#xff1a;page数据结…

大数据StarRocks(四) :常用命令

这次主要介绍生产工作中Starrocks时的常用命令 4.1 连接StarRocks 4.1.1 Linux命令行连接 [roothadoop1011 fe]# yum install mysql -y [roothadoop1011 fe]# mysql -h hadoop101 -uroot -P9030 -p4.1.2 Windows客户端 DBeaver 连接 4.2 常用命令 4.2.1 查看状态 1. 查看f…

Pytorch从零开始实战15

Pytorch从零开始实战——ResNeXt-50算法实战 本系列来源于365天深度学习训练营 原作者K同学 文章目录 Pytorch从零开始实战——ResNeXt-50算法实战环境准备数据集模型选择开始训练可视化总结 环境准备 本文基于Jupyter notebook&#xff0c;使用Python3.8&#xff0c;Pytor…

智能穿戴时代 | 米客方德SD NAND的崭新优势

SD NAND在智能穿戴上的优势 SD NAND是一种可以直接焊接在智能穿戴设备主板上的存储芯片&#xff0c;其小型化设计有助于紧凑设备尺寸&#xff0c;同时提供可靠的嵌入式存储解决方案。 这种集成设计减少了空间占用&#xff0c;同时确保设备在高度活动的环境中更为稳定。SD NAND…

漏洞复现--天融信TOPSEC两处远程命令执行

免责声明&#xff1a; 文章中涉及的漏洞均已修复&#xff0c;敏感信息均已做打码处理&#xff0c;文章仅做经验分享用途&#xff0c;切勿当真&#xff0c;未授权的攻击属于非法行为&#xff01;文章中敏感信息均已做多层打马处理。传播、利用本文章所提供的信息而造成的任何直…

EasyRecovery2024永久免费版电脑数据恢复软件

EasyRecovery是一款操作安全、价格便宜、用户自主操作的非破坏性的只读应用程序&#xff0c;它不会往源驱上写任何东西&#xff0c;也不会对源驱做任何改变。它支持从各种各样的存储介质恢复删除或者丢失的文件&#xff0c;其支持的媒体介质包括&#xff1a;硬盘驱动器、光驱、…

Linux第7步_设置虚拟机的电源

设置ubuntu代码下载源和关闭“自动检查更新”后&#xff0c;就要学习设置“虚拟机的电源”了。 用处不大&#xff0c;主要是了解”螺丝刀和扳手形状的图标“在哪里。 1、打开虚拟机&#xff0c;点击最右边的“下拉按钮”&#xff0c;弹出对话框&#xff0c;得到下图&#xff…