自定义注解

PermissionCheck:

package com.mgdd.sys.annotation;

import java.lang.annotation.*;

/**
* @author LWW
* @site www.lww.com
* @company
* @create 2019-12-16 14:08
*/ // 标注这个类它可以标注的位置
@Target({ElementType.METHOD,ElementType.ANNOTATION_TYPE})
// 标注这个注解的注解保留时期
@Retention(RetentionPolicy.RUNTIME)
// 是否生成注解文档
@Documented
public @interface PermissionCheck {
//自定义角色值,如果是多个角色,用逗号分割。
public String role() default "";
}

aop切面类,切到自定义注解PermissionCheck上,当方法上加了注解就会跳进来进行逻辑处理

PermissionCheckAspect:

package com.mgdd.sys.aspect;

import com.mgdd.sys.annotation.PermissionCheck;
import com.mgdd.sys.service.PermissionService;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang.StringUtils;
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.annotation.Pointcut;
import org.aspectj.lang.reflect.MethodSignature;
import org.springframework.stereotype.Component; import javax.annotation.Resource;
import java.lang.reflect.Method;
import java.util.Arrays;
import java.util.List; /**
* @author LWW
* @site www.lww.com
* @company
* @create 2019-12-16 14:20
*/
@Aspect
@Component
@Slf4j
public class PermissionCheckAspect {
@Resource
private PermissionService permissionService; //切入点表达式决定了用注解方式的方法切还是针对某个路径下的所有类和方法进行切,方法必须是返回void类型
@Pointcut(value = "@annotation(com.mgdd.sys.annotation.PermissionCheck)")
private void permissionCheckCut(){}; //定义了切面的处理逻辑。即方法上加了@PermissionCheck
@Around("permissionCheckCut()")
public Object around(ProceedingJoinPoint pjp) throws Throwable{
log.info("====================进入AOP============================");
//1.记录日志信息
Signature signature = pjp.getSignature();
String className = pjp.getTarget().getClass().getSimpleName();
String methodName = signature.getName();
log.info("className:{},methodName:{}",className,methodName); //2.角色权限校验
MethodSignature methodSignature = (MethodSignature)signature;
Method targetMethod = methodSignature.getMethod();
if (targetMethod.isAnnotationPresent(PermissionCheck.class)){
//获取方法上注解中表明的权限
PermissionCheck permission =targetMethod.getAnnotation(PermissionCheck.class);
String role =permission.role();
log.info("当前接口请求的用户角色role:{}",role);
if(StringUtils.isNotEmpty(role)){
String[] roles = role.split(",");//接口允许的角色
List<String> list = Arrays.asList(roles);
//根据id从数据库中查询管理员权限(可用前台传过来的id作为参数)
List<String> listPermission = permissionService.queryPermission(1);
//打印管理员权限
log.info("管理员拥有的权限:"+String.valueOf(listPermission));
//将注解上标明的权限与查出来的权限进行比对
for (String l : list){
if(!listPermission.contains(l)){
log.error("没有权限");
return null;
}
}
log.info("AOP权限角色校验通过,进入业务层处理!");
//3.执行业务逻辑,放行
return pjp.proceed();
}
}
return "O(∩_∩)O哈哈~";
} }

运用,在方法上面加上注解就行

    /**
* 分页查询
*
* @param params 请求参数集
* @return 结果集封装对象
*/
@GetMapping("queryPager")
@PermissionCheck(role = "sys:user:view")
public PageUtils queryPager(@RequestParam Map<String, Object> params) {
Query query = new Query(params);
List<Permission> list = permissionService.queryPager(query);
return new PageUtils(list, query.getTotal());
}

效果:

springboot通过AOP和自定义注解实现权限校验的更多相关文章

  1. 基于SpringBoot 、AOP与自定义注解转义字典值

    一直以来,前端展示字典一般以中文展示为主,若在表中存字典值中文,当字典表更改字典值对应的中文,会造成数据不一致,为此设置冗余字段并非最优方案,若由前端自己写死转义,不够灵活,若在业务代码转义,臃肿也不 ...

  2. 手写SpringBoot自动配置及自定义注解搭配Aop,实现升级版@Value()功能

    背景 项目中为了统一管理项目的配置,比如接口地址,操作类别等信息,需要一个统一的配置管理中心,类似nacos. 我根据项目的需求写了一套分布式配置中心,测试无误后,改为单体应用并耦合到项目中.项目中使 ...

  3. 用AOP拦截自定义注解并获取注解属性与上下文参数(基于Springboot框架)

    目录 自定义注解 定义切面 获取上下文信息JoinPoint ProceedingJoinPoint 定义测试方法 测试结果 小结 AOP可以用于日志的设计,这样话就少不了要获取上下文的信息,博主在设 ...

  4. 【spring boot】SpringBoot初学(6)– aop与自定义注解

    前言 github: https://github.com/vergilyn/SpringBootDemo 一.AOP 官方demo:https://github.com/spring-project ...

  5. spring AOP 和自定义注解进行身份验证

    一个SSH的项目(springmvc+hibernate),需要提供接口给app使用.首先考虑的就是权限问题,app要遵循极简模式,部分内容无需验证,用过滤器不能解决某些无需验证的方法 所以最终选择用 ...

  6. AOP 实现自定义注解

    1.自定义注解2.编写 AOP3.测试 1.自定义注解 package com.base.yun.spring.aop; import java.lang.annotation.Documented; ...

  7. Spring Boot系列——AOP配自定义注解的最佳实践

    AOP(Aspect Oriented Programming),即面向切面编程,是Spring框架的大杀器之一. 首先,我声明下,我不是来系统介绍什么是AOP,更不是照本宣科讲解什么是连接点.切面. ...

  8. 利用Spring AOP和自定义注解实现日志功能

    Spring AOP的主要功能相信大家都知道,日志记录.权限校验等等. 用法就是定义一个切入点(Pointcut),定义一个通知(Advice),然后设置通知在该切入点上执行的方式(前置.后置.环绕等 ...

  9. struts2拦截器加自定义注解实现权限控制

    https://blog.csdn.net/paul342/article/details/51436565 今天结合Java的Annotation和Struts2进行注解拦截器权限控制. 功能需求: ...

随机推荐

  1. windows10激活方法

    原文转自:http://www.ylmfwin100.com/ylmf/8643.html 现在市面上大致有两种主流激活方法,一种是通过激活码来激活,另外一种是通过激活工具来激活.但是激活工具有个弊端 ...

  2. 大数据学习(18)—— Flume介绍

    老规矩,学习新东西先上官网瞅瞅Apache Flume Flume是什么 Flume是一个分布式.可靠的大规模高效日志收集.汇聚和传输的这么一个服务.它的架构基于流式数据,配置简单灵活.它具备可调节的 ...

  3. IOS自动化测试环境搭建(Python & Java)

         一.前言 IOS的App自动化测试与Android的一样,也可以用appium来进行.但是IOS自动化依赖苹果的osx系统.Xcode构建等,且封闭的系统需要苹果开发者账号才可以驱动真机.A ...

  4. java小程序之随机任务发布器

    需求 自定义任务 随机定时 随机排序 集合输出 搭建 简单项目,所以我使用java 的maven来搭建一个控制台程序,并且使用excel来记录任务 创建任务类(sub) package com.mic ...

  5. 手把手教centos安装docker

    目录 版本说明 官网安装教程 安装docker 现在网络上安装教程满天飞,很大一部分是别人的总结,可以说是成果,却没有介绍如何去实现这个成果方法.这篇就结合官网教程来聊聊如何在centos上安装doc ...

  6. 如何根治慢SQL?

    本文摘自:CodeSheep 今天和大家聊一个常见的问题:慢SQL. 包括以下内容: 慢SQL的危害 SQL语句的执行过程 存储引擎和索引的那些事儿 慢SQL解决之道 后续均以MySQL默认存储引擎I ...

  7. Ubuntu Server安装telnet服务时"Unable to locate package telnetd"解决方法

    装好Ubuntu Server 12.04后,用apt-get安装telnetd报"E: Unable to locate package telnetd",解决方法如下: 虚拟机 ...

  8. Java课程设计 SSM新闻资讯管理系统 博客论坛管理系统 Java编程 博客系统源代码

    注意:该项目只展示部分功能,如需了解,评论区咨询即可. 1.开发环境 开发语言:Java后台框架:SSM(Spring+SpringMVC+Mybatis)前端技术:HTML+CSS+JavaScri ...

  9. 【笔记】初探KNN算法(2)

    KNN算法(2) 机器学习算法封装 scikit-learn中的机器学习算法封装 在python chame中将算法写好 import numpy as np from math import sqr ...

  10. 【原创】深入分析Ubuntu本地提权漏洞CVE-2017-16995

    *本文首发阿里云先知安全技术社区,原文链接https://xz.aliyun.com/t/2212 前言: 2018年3月中旬,Twitter 用户 @Vitaly Nikolenko 发布消息,称 ...