springboot + shiro 权限注解、统一异常处理、请求乱码解决
前篇
后台权限管理系统
相关:
- spring boot + mybatis + layui + shiro后台权限管理系统
- springboot + shiro之登录人数限制、登录判断重定向、session时间设置
- springboot + shiro 动态更新用户信息
基于前篇,新增功能:
- 新增shiro权限注解
- gaimor.cn
- 请求乱码问题解决;
- 统一异常处理。
源码已集成到项目中:
github源码: https://github.com/wyait/manage.git
码云:https://gitee.com/wyait/manage.git
github对应项目源码目录:wyait-manage-1.2.0
码云对应项目源码目录:wyait-manage-1.2.0
shiro注解的使用
shiro权限注解
Shiro 提供了相应的注解用于权限控制,如果使用这些注解就需要使用AOP 的功能来进行判断,如Spring AOP;Shiro 提供了Spring AOP 集成用于权限注解的解析和验证。
@RequiresAuthentication
表示当前Subject已经通过login 进行了身份验证;即Subject.isAuthenticated()返回true。
@RequiresUser
表示当前Subject已经身份验证或者通过记住我登录的。
@RequiresGuest
表示当前Subject没有身份验证或通过记住我登录过,即是游客身份。
@RequiresRoles(value={“admin”, “user”}, logical= Logical.AND)
@RequiresRoles(value={“admin”})
@RequiresRoles({“admin“})
表示当前Subject需要角色admin 和user。
@RequiresPermissions (value={“user:a”, “user:b”}, logical= Logical.OR)
表示当前Subject需要权限user:a或user:b。
Shiro的认证注解处理是有内定的处理顺序的,如果有多个注解的话,前面的通过了会继续检查后面的,若不通过则直接返回,处理顺序依次为(与实际声明顺序无关):
RequiresRoles
RequiresPermissions
RequiresAuthentication
RequiresUser
RequiresGuest
以上注解既可以用在controller中,也可以用在service中使用;
建议将shiro注解放在controller中,因为如果service层使用了spring的事物注解,那么shiro注解将无效。
shiro权限注解springAOP配置
shiro权限注解要生效,必须配置springAOP通过设置shiro的SecurityManager进行权限验证。
/**
*
* @描述:开启Shiro的注解(如@RequiresRoles,@RequiresPermissions),需借助SpringAOP扫描使用Shiro注解的类,并在必要时进行安全逻辑验证
* 配置以下两个bean(DefaultAdvisorAutoProxyCreator和AuthorizationAttributeSourceAdvisor)即可实现此功能
* </br>Enable Shiro Annotations for Spring-configured beans. Only run after the lifecycleBeanProcessor(保证实现了Shiro内部lifecycle函数的bean执行) has run
* </br>不使用注解的话,可以注释掉这两个配置
* @创建人:wyait
* @创建时间:2018年5月21日 下午6:07:56
* @return
*/
@Bean
public DefaultAdvisorAutoProxyCreator advisorAutoProxyCreator() {
DefaultAdvisorAutoProxyCreator advisorAutoProxyCreator = new DefaultAdvisorAutoProxyCreator();
advisorAutoProxyCreator.setProxyTargetClass(true);
return advisorAutoProxyCreator;
}
@Bean
public AuthorizationAttributeSourceAdvisor authorizationAttributeSourceAdvisor() {
AuthorizationAttributeSourceAdvisor authorizationAttributeSourceAdvisor = new AuthorizationAttributeSourceAdvisor();
authorizationAttributeSourceAdvisor.setSecurityManager(securityManager());
return authorizationAttributeSourceAdvisor;
}
springboot异常处理原理
场景:当用户正常访问网站时,因为某种原因后端出现exception的时候,直接暴露异常信息或页面显示给用户;
这种操作体验不是我们想要的。所以要对异常进行统一管理,能提高用户体验的同时,后台能详细定位到异常的问题点。
springboot异常概况
Spring Boot提供了默认的统一错误页面,这是Spring MVC没有提供的。在理解了Spring Boot提供的错误处理相关内容之后,我们可以方便的定义自己的错误返回的格式和内容。
编写by zero异常
在home页面,手动创建两个异常:普通异常和异步异常!
- 前端页面:
<p>
普通请求异常:
<a href="/error/getError">点击</a>
</p>
<p>
ajax异步请求异常:
<a href="javascript:void(0)" onclick="ajaxError()">点击</a>
</p>
...
//js代码
function ajaxError(){
$.get("/error/ajaxError",function(data){
layer.alert(data);
});
}
- 后端代码:
/**
*
* @描述:普通请求异常
* @创建人:wyait
* @创建时间:2018年5月24日 下午5:30:50
*/
@RequestMapping("getError")
public void toError(){
System.out.println(1/0);
}
/**
*
* @描述:异步异常
* @创建人:wyait
* @创建时间:2018年5月24日 下午5:30:39
*/
@RequestMapping("ajaxError")
@ResponseBody
public String ajaxError(){
System.out.println(1/0);
return "异步请求成功!";
}