使用aop做权限控制

news2024/9/25 5:24:30

1、pom.xml文件内容如下:

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.6.4</version>
        <relativePath/> <!-- lookup parent from repository -->
    </parent>
    <groupId>com.hmblogs</groupId>
    <artifactId>hmblogs</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <name>hmblogs</name>
    <description>hmblogs</description>
    <properties>
        <java.version>8</java.version>
        <druid.version>1.2.8</druid.version>
        <log4jdbc.version>1.16</log4jdbc.version>
        <es.version>7.9.2</es.version>
    </properties>
    <dependencies>
        <!-- druid数据源驱动 -->
        <dependency>
            <groupId>com.alibaba</groupId>
            <artifactId>druid-spring-boot-starter</artifactId>
            <version>${druid.version}</version>
        </dependency>

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter</artifactId>
        </dependency>

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>

        <!-- mybatis -->
        <dependency>
            <groupId>com.baomidou</groupId>
            <artifactId>mybatis-plus-boot-starter</artifactId>
            <version>3.5.3.1</version>
        </dependency>

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
        </dependency>

        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
            <optional>true</optional>
        </dependency>

        <!--Mysql依赖包-->
        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
            <scope>runtime</scope>
        </dependency>

        <!--lombok插件-->
        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
            <optional>true</optional>
        </dependency>

        <!--监控sql日志-->
        <dependency>
            <groupId>org.bgee.log4jdbc-log4j2</groupId>
            <artifactId>log4jdbc-log4j2-jdbc4.1</artifactId>
            <version>${log4jdbc.version}</version>
        </dependency>

        <dependency>
            <groupId>com.alibaba</groupId>
            <artifactId>fastjson</artifactId>
            <version>1.2.9</version>
        </dependency>

        <dependency>
            <groupId>redis.clients</groupId>
            <artifactId>jedis</artifactId>
        </dependency>

        <dependency>
            <groupId>org.apache.kafka</groupId>
            <artifactId>kafka-clients</artifactId>

        </dependency>

        <dependency>
            <groupId>org.springframework.kafka</groupId>
            <artifactId>spring-kafka</artifactId>

        </dependency>

        <!-- high client-->
        <dependency>
            <groupId>org.elasticsearch.client</groupId>
            <artifactId>elasticsearch-rest-high-level-client</artifactId>
            <version>${es.version}</version>
            <exclusions>
                <exclusion>
                    <groupId>org.elasticsearch</groupId>
                    <artifactId>elasticsearch</artifactId>
                </exclusion>
                <exclusion>
                    <groupId>org.elasticsearch.client</groupId>
                    <artifactId>elasticsearch-rest-client</artifactId>
                </exclusion>
            </exclusions>
        </dependency>

        <!-- rest-high-level-client 依赖如下2个jar -->
        <dependency>
            <groupId>org.elasticsearch</groupId>
            <artifactId>elasticsearch</artifactId>
            <version>${es.version}</version>
        </dependency>
        <dependency>
            <groupId>org.elasticsearch.client</groupId>
            <artifactId>elasticsearch-rest-client</artifactId>
            <version>${es.version}</version>
        </dependency>
        <dependency>
            <groupId>junit</groupId>
            <artifactId>junit</artifactId>
        </dependency>

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-data-mongodb</artifactId>
        </dependency>

        <!--        spring需要依赖日志文件-->
        <dependency>
            <groupId>commons-logging</groupId>
            <artifactId>commons-logging</artifactId>
            <version>1.2</version>
        </dependency>

        <dependency>
            <groupId>org.aspectj</groupId>
            <artifactId>aspectjweaver</artifactId>
            <version>1.9.0</version>
        </dependency>
        <dependency>
            <groupId>org.aspectj</groupId>
            <artifactId>aspectjrt</artifactId>
            <version>1.9.0</version>
        </dependency>

        <dependency>
            <groupId>com.googlecode.aviator</groupId>
            <artifactId>aviator</artifactId>
            <version>5.3.0</version>
        </dependency>




    </dependencies>

    <build>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
            </plugin>
        </plugins>
    </build>

</project>

2、application.yml文件内容如下:

server:
  port: 8081
  servlet.context-path: /

#配置数据源
spring:
  datasource:
    druid:
      db-type: com.alibaba.druid.pool.DruidDataSource
      driverClassName: net.sf.log4jdbc.sql.jdbcapi.DriverSpy
      url: jdbc:log4jdbc:mysql://${DB_HOST:localhost}:${DB_PORT:3306}/${DB_NAME:eladmin}?serverTimezone=Asia/Shanghai&characterEncoding=utf8&useSSL=false
      username: ${DB_USER:root}
      password: ${DB_PWD:密码}
  redis:
    host: localhost
    port: 6379
    password: 密码
    database: 10
#  data:
#    mongodb:
#      host: 43.138.0.199
#      port: 27017
#      username: hmblogs
#      password: 密码
#      database: hmblogs
#      authentication-database: admin

es:
  host: 43.138.0.199
  port: 9200
  scheme: http
  user: elastic
  password: 密码

3、AopController类代码如下:

package com.hmblogs.backend.controller;

import com.hmblogs.backend.util.PreAuthorize;
import lombok.extern.slf4j.Slf4j;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;

@RestController
@Slf4j
public class AopController {

    @PreAuthorize(hasPermi = "system:stock:list")
    /**
     * findAllStocks
     * @return
     */
    @GetMapping(value = "/findAllStocks2")
    public String findAllStocks(){
        return "stockTest";
    }

}

4、PreAuthorize类代码如下:

package com.hmblogs.backend.util;

import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;

/**
 * 权限注解
 *
 */
@Target({ ElementType.TYPE, ElementType.METHOD })
@Retention(RetentionPolicy.RUNTIME)
public @interface PreAuthorize
{
    /**
     * 验证用户是否具备某权限
     */
    public String hasPermi() default "";

}

5、PreAuthorizeAspect类代码如下:

package com.hmblogs.backend.util;

import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.Signature;
import org.aspectj.lang.annotation.Around;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.reflect.MethodSignature;
import org.springframework.stereotype.Component;
import org.springframework.util.StringUtils;

import java.lang.reflect.Method;
import java.util.Arrays;
import java.util.HashMap;
import java.util.Map;

/**
 * 自定义权限实现
 *
 */
@Aspect
@Component
public class PreAuthorizeAspect{

    @Around("@annotation(com.hmblogs.backend.util.PreAuthorize)")
    public Object around(ProceedingJoinPoint point) throws Throwable
    {
        Signature signature = point.getSignature();
        MethodSignature methodSignature = (MethodSignature) signature;
        Method method = methodSignature.getMethod();
        PreAuthorize annotation = method.getAnnotation(PreAuthorize.class);
        if (annotation == null)
        {
            return point.proceed();
        }

        if (!StringUtils.isEmpty(annotation.hasPermi()))
        {
            if (hasPermi(annotation.hasPermi()))
            {
                return point.proceed();
            }
            throw new PreAuthorizeException("没有权限");
        }

        return point.proceed();
    }

    /**
     * 验证用户是否具备某权限
     *
     * @param permission 权限字符串
     * @return 用户是否具备某权限
     */
    public boolean hasPermi(String permission) {
        // 这里模拟从数据库查出来了哪些用户有哪些权限。
        Map<String, String> userList = new HashMap<>();
        userList.put("system:stock:list", "admin,heming,abc");
        userList.put("system:product:list", "admin");
        String users = userList.get(permission);
        if (StringUtils.isEmpty(users)) {
            return false;
        }
        String[] userArray = users.split(",");
        String blogUser = RequestAttributeUtil.getUser("blogUser");
        if (Arrays.asList(userArray).contains(blogUser)) {
            return true;
        }
        return false;
    }
}

6、PreAuthorizeException类代码如下:

package com.hmblogs.backend.util;

public class PreAuthorizeException extends RuntimeException{
    private String errMsg;

    public PreAuthorizeException(String message, Throwable cause) {
        super(message, cause);
        this.errMsg = message;
    }

    public PreAuthorizeException(String message) {
        super(message);
        this.errMsg = message;
    }

    public String getErrMsg() {
        return errMsg;
    }
}

7、验证

7.1没权限的情况,jack没权限访问这个接口。

7.2有权限的情况,heming有权限。

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

快速画流程图

使用在线工具&#xff1a;PlantUML PlantUML 官网:https://plantuml.com/ 中文官网:https://plantuml.com/zh/ 使用步骤如下&#xff1a; 1、拷贝一个完成函数&#xff1a; int func_init(const char *tag) {if (tag ! NULL) {printf("set TAG :%s", tag);}print…

固定资产管理系统有哪些应用价值

固定资产管理已成为当今企业经营中不可忽视的重要环节。伴随着时代的发展&#xff0c;固定资产管理系统的出现&#xff0c;为企业提供了一种高效、精确的管理方式。那固定资产管理系统实际有什么实际意义呢&#xff1f;本文将从以下几个方面进行讨论。  固定资产管理系统可以…

Python入门操作学习记录

图行画程序设计--海龟绘图 1、爱心 import turtle turtle.showturtle() turtle.width(20) turtle.write("c的弃子") turtle.color("red") turtle.left(50) turtle.forward(250) turtle.goto(60,300) turtle.goto(0,225) turtle.left(83) turtle.forward(…

户外LED显示屏的10大技术参数详解

随着户外广告市场需求的不断提升&#xff0c;LED显示屏作为一种重要的广告传播媒介&#xff0c;其应用范围和技术水平也在不断提高。然而&#xff0c;在众多LED显示屏品牌中如何选购到满意的产品成为行业用户关注的焦点。了解LED显示屏的各项技术参数是选择合适产品的首要步骤。…

Docker专题-04 Nginx部署

Docker专题-04 Nginx部署 注&#xff1a; 本教程由羞涩梦整理同步发布&#xff0c;本人技术分享站点&#xff1a;blog.hukanfa.com 转发本文请备注原文链接&#xff0c;本文内容整理日期&#xff1a;2024-03-21 csdn 博客名称&#xff1a;五维空间-影子&#xff0c;欢迎关注…

中文数字与阿拉伯数字:数字符号的文化交融

title: 中文数字与阿拉伯数字&#xff1a;数字符号的文化交融 date: 2024/3/21 17:46:31 updated: 2024/3/21 17:46:31 tags: 数字起源符号系统差异中文数字特点阿拉伯数字优势转换技术应用文化交流融合数字表达互通 中文数字与阿拉伯数字的关系起源&#xff1a; 中文数字是古…

【C++庖丁解牛】面向对象的三大特性之一多态 | 抽象类 | 多态的原理 | 单继承和多继承关系中的虚函数表

&#x1f341;你好&#xff0c;我是 RO-BERRY &#x1f4d7; 致力于C、C、数据结构、TCP/IP、数据库等等一系列知识 &#x1f384;感谢你的陪伴与支持 &#xff0c;故事既有了开头&#xff0c;就要画上一个完美的句号&#xff0c;让我们一起加油 目录 前言1. 多态的概念1.1 概…

ServletConfig和ServletContext

ServletConfig接口 在Servlet运行期间&#xff0c;需要一些配置信息&#xff0c;这些信息都可以在WebServlet注解的属性中配置。当Tomcat初始化一个Servlet时&#xff0c;会将该Servlet的配置信息封装到一个ServletConfig对象中&#xff0c;通过调用init(ServletConfig config…

@Autowired详解

请直接看原文: Autowired注解详解——超详细易懂-CSDN博客 -------------------------------------------------------------------------------------------------------------------------------- Autowired详解 要搞明白Autowired注解就是要了解它是什么&#xff1f;有…

【蓝桥杯备赛】Day15:递推与递归(倒计时23天)

题目1:题目 2335: 信息学奥赛一本通T1422-活动安排 设有n个活动的集合E{1,2,…,n}&#xff0c;其中每个活动都要求使用同一资源&#xff0c;如演讲会场等&#xff0c;而在同一时间内只有一个活动能使用这一资源。每个活动i都有一个要求使用该资源的起始时间si和一个结束时间fi…

英伟达 GTC 2024大会不可错过的亮点!带你一窥AI和高性能计算的最新趋势!

会议之眼 快讯 2024年的英伟达GTC大会再次掀起了科技界的热潮&#xff0c;展示了该公司在人工智能、图形处理和高性能计算领域的最新突破。来自全球各地的科技领袖、工程师和创新者齐聚一堂&#xff0c;共同探讨未来技术的前沿。在这令人期待的盛会上&#xff0c;英伟达发布了一…

移动硬盘数据可以保存多长时间?数据丢失怎么办

随着数字世界的飞速发展&#xff0c;移动硬盘已经成为我们生活中不可或缺的数据存储设备。无论是珍贵的个人照片、重要的工作文件&#xff0c;还是海量的多媒体内容&#xff0c;我们越来越依赖于移动硬盘来存储和传输数据。然而&#xff0c;随着时间的推移&#xff0c;我们不禁…

【鸿蒙HarmonyOS开发笔记】应用数据持久化之通过用户首选项实现数据持久化

概述 应用数据持久化&#xff0c;是指应用将内存中的数据通过文件或数据库的形式保存到设备上。内存中的数据形态通常是任意的数据结构或数据对象&#xff0c;存储介质上的数据形态可能是文本、数据库、二进制文件等。 HarmonyOS标准系统支持典型的存储数据形态&#xff0c;包…

Docker Compose部署YAPI

1、首先已安装mongodb 2、 使用navicat连接数据库&#xff0c;使用以下命令创建数据库&#xff1a; # 先use命令切换至yapi数据库。如果该库不存在&#xff0c;那么则会创建该数据库。 use yapi; # 创建用户&#xff0c;分配权限&#xff0c;下面会用到该用户和密码 db.…

数组实现对数组中对象中的指定项的查找并输出该条记录

文章目录 需求分析 需求 已知返回的数据如下&#xff1a;&#xff0c;现需找到指定字段的那一项并输出 分析 写一个方法就能搞定&#xff0c;代码中定义了一个名为 findDeviceByName 的函数&#xff0c;它会遍历给定的数组&#xff0c;查找其中 deviceName 字段值等于目标…

骨传导游泳耳机怎么样?四款个性能卓越的骨传导游泳耳机收录!

在游泳运动中&#xff0c;音乐是许多人不可或缺的陪伴。然而传统耳机在水下使用时常常会出现各种问题&#xff0c;比如防水性能不佳、音质下降等。随着科技的进步&#xff0c;一种新型的耳机——骨传导游泳耳机应运而生。 它不仅具备出色的防水性能&#xff0c;还能通过骨头传递…

许战海战略文库|橋頭品牌突破区域局限打透全国市场的4个建议

自宣统元年(公元1908年)起&#xff0c;重庆南岸区海棠溪古石桥边诞生了一家传奇火锅店——桥头火锅。凭借深厚的文化底蕴和独特的风味&#xff0c;历经百年沉淀桥头火锅已成为南岸区乃至中华餐饮文化中的璀璨明珠。 桥头火锅不仅荣获了“中华老字号”和“中国名菜”两项殊荣&a…

第十节HarmonyOS 常用容器组件1-Badge

1、描述 可以附加在单个组件上用于信息标记的容器组件。支持单个子组件。 2、接口 方法1&#xff1a;Badge(value:{count: number, position?: BadgePosition, maxCount?: number, style:BadgeStyle}) 方法2&#xff1a;Badge(value: {value: string, position?: BadgeP…

Jenkins安装Role-based Authorization Strategy不生效

Jenkins安装Role-based Authorization Strategy不生效&#xff0c;需开启Role-based 访问策略。 https://blog.51cto.com/zengestudy/1782494

阶乘的强悍溢出技能

【题目描述】 输入n&#xff0c;计算S&#xff1d;1&#xff01;&#xff0b;2&#xff01;&#xff0b;3&#xff01;&#xff0b;…&#xff0b;n&#xff01;的末6位&#xff08;不含前导0&#xff09;。&#xff0c;n&#xff01;表示 前n个正整数之积。 【样例输入】 …