0
点赞
收藏
分享

微信扫一扫

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

绣文字 2022-04-22 阅读 30
java后端

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

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

1> 添加访问权限

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

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

2> 对用户授权

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

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

3> 未授权时返回error

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

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

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

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

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

/noauth接口

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

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

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

1> 添加访问权限

@RequiresPermissions(value = {"user:add"})
@RequestMapping({"/user/add"})
public String add(){
    return "user/add";
}

像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 "权限认证失败";
    }
}

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

举报

相关推荐

0 条评论