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> 对用户授权
在realm
的doGetAuthorizationInfo
方法中授予用户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
接口时,返回值就是权限认证失败
并且由于我们统一全局捕获了这个异常并处理,所以后台也不会抛出异常。