一、场景

在使用shiro框架的时候,遇到了这样的需求:本系统有多个用户,每个用户分配不同角色,每个角色的权限也不一致。比如A用户拥有新闻列表的增删改查权限,而B用户只有查看新闻列表的权限,而没有删除、新增、修改的权限,此时有3种方案:1、不给B用户分配删除、新增、修改的菜单,这样用户就无法点击从而无法操作。2、给B用户分配菜单,后台中进行增删改查操作时都要进行权限验证。  3、给B用户分配菜单并且进行操作的时候校验权限。

显然,第2、3种方案比第1中方案要安全。本系统中使用第二种方案。

二、为什么使用注解+AOP

使用shiro过程中一般都会自定义Realm,Realm主要进行权限和登录的校验,当校验登录用户是否有某个权限的时候,有2种方式:1、使用注解 @RequiresPermissions("news:*")  来判断用户是否有news的所有权限。   2、使用Subject.isPermitted("news:*") 方法判断用户是否有news的所有权限。

这两种方法的区别在于,第一种:比如当前用户在新闻列表中删除某篇新闻,但是该用户并没有这种权限,此时会抛出异常,我们需要处理异常即可,但是页面进行跳转,我们希望用户在新闻列进行删除操作的时候,如果没有该权限则会弹窗提示,而不是跳转到统一的异常页面。 第二种,可以实现第一种的不足,但是没有第一种方便快捷。

为了综合上述两种的有点以及缺点,实现shiro校验权限时有异常但不刷新页面,同时以注解的形式使用。

三、实现

实现的效果:需要校验权限的方法比如删除方法del(),只要在该方法上添加自定义注解,即可实现上述效果。

3.1    自定义注解

/**
 * 类名 :权限控制注解
 * 用法 :
 * 创建人 : shyroke
 * 时间:2018/12/18 10:33
 */ @Documented
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.METHOD)
public @interface PermissionAnnotation {     String permissionName(); }

3.2    编写切面

/**
 * 类名 :权限的切面类
 * 用法 :
 * 创建人 : shyroke
 * 时间:2018/12/18 10:38
 */
@Aspect
@Component
public class PermissionAspect {     @Pointcut("@annotation(com.shyroke.daydayzhuan.util.PermissionAnnotation)")
    private void permisson(){     }     /**
     * 给添加PermissionAnnotation注解的方法校验权限,而不必每个方法内都判断权限
     * @param joinPoint
     * @param permissionAnnotation
     * @return
     * @throws Throwable
     */
    @Around("permisson()&&@annotation(permissionAnnotation)")
    public Object advice(ProceedingJoinPoint joinPoint, PermissionAnnotation permissionAnnotation) throws  Throwable {         R r = null;         r = (R) joinPoint.proceed();         String permissionName =permissionAnnotation.permissionName();         if(StringUtils.isEmpty(permissionName)){
           r.setFlag(false);
           r.setMessage("权限名称不能为空");
           return r;
        }         //校验当前登录用户是否有该权限
        boolean isPermission = UserUtils.isPermission(permissionName);         if(!isPermission){
            r.setFlag(false);
            r.setMessage("没有此操作权限!");
        }         return r;     } }

UserUtils.java

/**
 * 类名 :用户的工具类
 * 用法 :
 * 创建人 : shyroke
 * 时间:2018/12/18 14:39
 */
public class UserUtils {     /**
     * 校验当前登录用户是否有该权限
     * @param permissionname 权限名称
     * @return
     */
    public static boolean isPermission(String permissionname) {         Subject subject = SecurityUtils.getSubject();         if(subject.isPermitted(permissionname)){
            return true;
        }else{
            return false;
        }     }
}

3.3    使用

@PermissionAnnotation(permissionName = "boke:*")
@PostMapping(value = "desc")
@ResponseBody
public R desc(){
    return R.ok("删除成功!");
}

3.4    结果

使用自定义注解和AOP管理shiro权限的更多相关文章

  1. 通过AOP自定义注解实现日志管理

    前言: 通过自定义注解和AOP结合的方式,实现日志的记录功能 大致流程:项目运行->用户操作调用业务处理类->通过自定义的注解(我理解为一个切点)->进入到AOP切面类(在这里可以获 ...

  2. 如何通过自定义注解实现AOP切点定义

    面向切面编程(Aspect Oriented Programming, AOP)是面向对象编程(Object Oriented Programming,OOP)的强大补充,通过横切面注入的方式引入其他 ...

  3. SpringBoot自定义注解、AOP打印日志

    前言 在SpringBoot中使用自定义注解.aop切面打印web请求日志.主要是想把controller的每个request请求日志收集起来,调用接口.执行时间.返回值这几个重要的信息存储到数据库里 ...

  4. 基于springboot通过自定义注解和AOP实现权限验证

    一.移入依赖 <parent> <groupId>org.springframework.boot</groupId> <artifactId>spri ...

  5. spring AOP自定义注解 实现日志管理

    今天继续实现AOP,到这里我个人认为是最灵活,可扩展的方式了,就拿日志管理来说,用Spring AOP 自定义注解形式实现日志管理.废话不多说,直接开始!!! 关于配置我还是的再说一遍. 在appli ...

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

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

  7. 如何优雅地在 Spring Boot 中使用自定义注解,AOP 切面统一打印出入参日志 | 修订版

    欢迎关注个人微信公众号: 小哈学Java, 文末分享阿里 P8 资深架构师吐血总结的 <Java 核心知识整理&面试.pdf>资源链接!! 个人网站: https://www.ex ...

  8. java/springboot自定义注解实现AOP

    java注解 即是注释了,百度解释:也叫元数据.一种代码级别的说明. 个人理解:就是内容可以被代码理解的注释,一般是一个类. 元数据 也叫元注解,是放在被定义的一个注解类的前面 ,是对注解一种限制. ...

  9. Spring Boot 自定义注解,AOP 切面统一打印出入参请求日志

    其实,小哈在之前就出过一篇关于如何使用 AOP 切面统一打印请求日志的文章,那为什么还要再出一篇呢?没东西写了? 哈哈,当然不是!原因是当时的实现方案还是存在缺陷的,原因如下: 不够灵活,由于是以所有 ...

随机推荐

  1. 错误 Unable to connect to a repository at URL 'svn://ip地址' 和 No repository found in 'svn://ip地址'

    SVN服务器是CentOS6.10 使用TortoiseSVN客户端检出时遇到如下图所示的错误: 是因为没有指定SVN仓库的路径 在SVN服务器执行命令:svnserve -d -r /SVN版本库的 ...

  2. idea忽略.iml文件

    .iml 和 eclipse中的.classpath,.project都属于开发工具配置文件, 也就是在项目导入ide的过程中生成的配置文件,每个人开发环境是不一样的,所以这个文件没必要提交. 而且如 ...

  3. 201671010404+陈润菊 实验十四 团队项目评审课程&学习总结

    个人学习总结博客 这个作业属于哪个课程 软件工程任教教师 这个作业的要求在哪里 https://www.cnblogs.com/nwnu-daizh/p/11093584.html 作业学习目标 (1 ...

  4. 项目Beta冲刺(5/7)(追光的人)(2019.5.27)

    所属课程 软件工程1916 作业要求 Beta冲刺博客汇总 团队名称 追光的人 作业目标 描述Beta冲刺每日的scrum和PM报告两部分 队员学号 队员博客 221600219 小墨 https:/ ...

  5. XXE(外部实体注入攻击)

    利用XXE漏洞可以进行拒绝服务攻击.文件读取.命令代码执行.SQL(XSS)注入.内外扫描端口和入侵内网站点等,内网探测和入侵是利用XXE中支持的协议进行内网主机和端口的发现,可以理解为使用XXE进行 ...

  6. Windows上使用Linux命令

    WSL Windows Subsystem for Linux(简称WSL)是一个在Windows 10上能够运行原生Linux二进制可执行文件(ELF格式)的兼容层.它是由微软与Canonical公 ...

  7. 使用docker部署微服务

    https://my.oschina.net/silenceyawen/blog/1819472 http://jvm123.com/2019/08/docker-shi-yong.html 从201 ...

  8. luogu P3799 妖梦拼木棒

    二次联通门 : luogu P3799 妖梦拼木棒 /* luogu P3799 妖梦拼木棒 用一个桶存下所有的木棒 美剧两根短的木棒长度 后随便乘一乘就 好了.. */ #include <a ...

  9. connect via ssh to virtualbox guest vm without knowing ip address

    cat ssh-vm HOSTIP=`ip route get 1 | awk '{match($0, /.+src\s([.0-9]+)/, a);print a[1];exit}'` HOST_N ...

  10. Linux:搭建GitLab

    0.写在前面 GitLab官方明确要求最低配置2核4G,如果配置过低,会出现502错误. 1.安装SSH #安装ssh sudo yum install -y curl policycoreutils ...