• shiro中给某个接口添加权限的两种方法,若没有权限则返回特定值


    shiro中给某个接口添加权限的两种方法,若没有权限则返回特定值

    1、在ShiroConfig中的ShiroFilterFactoryBean这个bean中添加过滤器,在过滤器中对接口添加访问权限

    1> 添加访问权限

    Map filterMap = new LinkedHashMap<>();
    filterMap.put("/user/add", "perms[user:add]");   //授权
    shiroFilterFactoryBean.setFilterChainDefinitionMap(filterMap);
    
    • 1
    • 2
    • 3

    /user/add接口需要有user:add权限才可访问

    2> 对用户授权

    realmdoGetAuthorizationInfo方法中授予用户user:add权限

    SimpleAuthorizationInfo info = new SimpleAuthorizationInfo();
    info.addStringPermission("user:add");   //授予用户权限
    
    • 1
    • 2

    3> 未授权时返回error

    用户访问/user/add接口时,若没有授予该权限,则返回为
    在这里插入图片描述通过写一个拦截器,发现访问请求会被转移到/error请求,这是shiro内置的一个错误请求接口

    地址栏没变,但是返回值显示这是一个/error请求,由于Unauthorized引发的错误,并且通过写一个拦截器,发现这个请求的确被定向到/error

    4> 设置未授权时返回值接口

    没有权限时,我们想要将返回值改为自己定义的返回值,所以在ShiroFilterFactoryBean这个bean中设置未授权时返回值接口

    // 设置未授权返回值接口
    shiroFilterFactoryBean.setUnauthorizedUrl("/noauth");
    
    • 1
    • 2

    /noauth接口

    @RequestMapping("/noauth")
    @ResponseBody
    public String unauthorized(){
        return "未经授权, 无法访问此接口";
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5

    若没有权限,返回值为
    在这里插入图片描述
    直接被重定向到/noauth

    2、通过注解@RequiresPermissions对接口添加访问权限

    1> 添加访问权限

    @RequiresPermissions(value = {"user:add"})
    @RequestMapping({"/user/add"})
    public String add(){
        return "user/add";
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5

    像1中一样给用户授予user:add权限之后即可正常访问

    2> 未授权时抛出异常

    但是未给用户授予此权限时
    在这里插入图片描述
    请求同样转移到了/error接口,但是返回值并不是Unauthorized,而是服务器内部错误,并且后台报异常如下,这个异常表示的又是Not authorized,说明我们在ShiroFilterFactoryBean这个bean中设置未授权时返回值接口并没有起作用
    在这里插入图片描述
    这是由于shiro注解模式下,登录失败或者是没有权限都是抛出异常,并且默认的没有对异常做处理,所以我们可以对这个异常进行统一捕获处理,让这个异常返回特定值

    3> 统一异常捕获处理

    添加NoPermissionException.java

    import org.apache.shiro.authz.AuthorizationException;
    import org.springframework.web.bind.annotation.ControllerAdvice;
    import org.springframework.web.bind.annotation.ExceptionHandler;
    import org.springframework.web.bind.annotation.ResponseBody;
    
    @ControllerAdvice
    public class NoPermissionException {
    
        @ResponseBody
        @ExceptionHandler(AuthorizationException.class)
        public String AuthorizationException(Exception ex) {
            return "权限认证失败";
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14

    我们没有权限时再去访问/user/add接口时,返回值就是权限认证失败
    在这里插入图片描述
    并且由于我们统一全局捕获了这个异常并处理,所以后台也不会抛出异常。

  • 相关阅读:
    代理模式——动静态代理,面向接口编程
    mac gitee新建工程遇到的一些问题
    C++的IO流
    请问什么是 CICD
    DS18B20数字温度计 (三) 1-WIRE总线 ROM搜索算法和实际测试
    Jvm基础面试题
    外贸多语种视频营销是怎么做的?原理如何理解?
    多极神经元切片手绘图,神经组织切片手绘图片
    宏macro
    python操作docker
  • 原文地址:https://blog.csdn.net/m0_67266585/article/details/126496231