首页
登录 | 注册

springboot + shiro 权限注解、统一异常处理、请求乱码解决

springboot + shiro 权限注解、统一异常处理、请求乱码解决

前篇

后台权限管理系统

相关: 

基于前篇,新增功能:

  1. 新增shiro权限注解
  2. gaimor.cn
  3. 请求乱码问题解决;
  4. 统一异常处理。

源码已集成到项目中: 

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的时候,直接暴露异常信息或页面显示给用户; 

www.acgred.cn

这种操作体验不是我们想要的。所以要对异常进行统一管理,能提高用户体验的同时,后台能详细定位到异常的问题点。

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 "异步请求成功!";
}


2020 jeepxie.net webmaster#jeepxie.net
10 q. 0.009 s.
京ICP备10005923号