前后端分离Shiro未执行授权方法解决办法

Posted 程序员超时空

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了前后端分离Shiro未执行授权方法解决办法相关的知识,希望对你有一定的参考价值。

Shior简介

Apache Shiro是一个强大且易用的Java安全框架,执行身份验证、授权、密码和会话管理。使用Shiro的易于理解的API,您可以快速、轻松地获得任何应用程序,从最小的移动应用程序到最大的网络和企业应用程序。

三个核心组件:Subject, SecurityManager 和 Realms.

Subject:即“当前操作用户”。但是,在Shiro中,Subject这一概念并不仅仅指人,也可以是第三方进程、后台帐户(Daemon Account)或其他类似事物。它仅仅意味着“当前跟软件交互的东西”。
  Subject代表了当前用户的安全操作,SecurityManager则管理所有用户的安全操作。
  SecurityManager:它是Shiro框架的核心,典型的Facade模式,Shiro通过SecurityManager来管理内部组件实例,并通过它来提供安全管理的各种服务。
  Realm: Realm充当了Shiro与应用安全数据间的“桥梁”或者“连接器”。也就是说,当对用户执行认证(登录)和授权(访问控制)验证时,Shiro会从应用配置的Realm中查找用户及其权限信息。
  从这个意义上讲,Realm实质上是一个安全相关的DAO:它封装了数据源的连接细节,并在需要时将相关数据提供给Shiro。当配置Shiro时,你必须至少指定一个Realm,用于认证和(或)授权。配置多个Realm是可以的,但是至少需要一个。

Shiro Realm

Realm:域,Realm 充当了 Shiro 与应用安全数据间的“桥梁”或者“连接器”。也就是说,当对用户执行认证(登录)和授权(访问控制)验证时,Shiro 会从应用配置的 Realm 中查找用户及其权限信息。从这个意义上讲,Realm 实质上是一个安全相关的 DAO:它封装了数据源的连接细节,并在需要时将相关数据提供给 Shiro 。当配置 Shiro时,你必须至少指定一个 Realm ,用于认证和(或)授权。配置多个 Realm 是可以的,但是至少需要一个。
Shiro 内置了可以连接大量安全数据源(又名目录)的 Realm,如 LDAP、关系数据库(JDBC)、类似 INI 的文本配置资源以及属性文件等。如果缺省的 Realm 不能满足需求,你还可以插入代表自定义数据源的自己的 Realm 实现。

Realm能做的工作主要有以下几个方面:

身份验证(doGetAuthenticationInfo方法)验证账户和密码,并返回相关信息

权限获取(doGetAuthorizationInfo 方法) 获取指定身份的权限,并返回相关信息

令牌支持(supports方法)判断该令牌(Token)是否被支持

令牌有很多种类型,例如:HostAuthenticationToken(主机验证令牌),UsernamePasswordToken(账户密码验证令牌)

问题就出在权限获取这里,因为shiro的doAuthorizationInfo 方法不是登录即执行,而是需要检测用户权限的时候才会调用此方法,例如checkRole,checkPermission之类的,也就是需要在进行角色权限校验的时候才执行。

怎样才能在前后端分离触发权限校验?最简单的办法就是使用权限注解,例如:

    @RequiresRoles(value = "admin")
    @RequestMapping(value = "/users", method = RequestMethod.GET)
    public ResultInfo allSysUser(Integer currentPage, Integer pageSize) 
        return ResultInfo.ok().data("pageInfo", sysUserInfoService.getAllUsers(currentPage
                , pageSize));
    

而这样进行测试之后还是不行,说明还是没有触发,后续通过不断查资料,发现需要引入aop才能正常回调授权方法,导入如下jar包即可,版本根据自己项目调整。正在查看为什么要开启aop,欢迎评论区发表见解

        <dependency>
            <groupId>org.aspectj</groupId>
            <artifactId>aspectjweaver</artifactId>
            <version>1.9.5</version>
        </dependency>


        <!-- https://mvnrepository.com/artifact/cglib/cglib -->
        <dependency>
            <groupId>cglib</groupId>
            <artifactId>cglib</artifactId>
            <version>3.3.0</version>
        </dependency>
        <!-- https://mvnrepository.com/artifact/org.springframework.boot/spring-boot-starter-aop -->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-aop</artifactId>
            <version>2.1.11.RELEASE</version>
        </dependency>

以上是关于前后端分离Shiro未执行授权方法解决办法的主要内容,如果未能解决你的问题,请参考以下文章

基于前后端分离的授权及认证(Shiro-SpringBoot-Vue)

Spring Boot整合Shiro实现前后端分离

spring boot2整合shiro安全框架实现前后端分离的JWT token登录验证

SpringBoot+Shiro框架整合实现前后端分离的权限管理基础Demo

springboot shiro 前后端分离,解决跨域过虑options请求shiro管理session问题模拟跨域请求

shirospringbootvueelementUI CDN模式前后端分离的权限管理demo 附源码