SpringBoot进阶之整合Shiro鉴权框架(四)

简介: SpringBoot进阶之整合Shiro鉴权框架(四)

前言

大家好,一直以来我都本着用最通俗的话理解核心的知识点, 我认为所有的难点都离不开 基础知识 的铺垫。目前正在出一个SpringBoot长期系列教程,从入门到进阶, 篇幅会较多~


适合人群

  • 学完Java基础
  • 想通过Java快速构建web应用程序
  • 想学习或了解SpringBoot
  • SpringBoot进阶学习

大佬可以绕过 ~


背景

如果你是一路看过来的,很高兴你能够耐心看完。之前带大家学了Springboot基础部分,对基本的使用有了初步的认识, 接下来的几期内容将会带大家进阶使用,会先讲解基础中间件的使用和一些场景的应用,或许这些技术你听说过,没看过也没关系,我会带大家一步一步的入门,耐心看完你一定会有收获~


情景回顾

上期带大家学习了Shiro中如何记录用户状态,本期将带大家学习Shiro中如何进行权限认证。同样的,我们集成到Springboot中。


doGetAuthenticationInfo()

还记得之前带大家实现的doGetAuthenticationInfo()方法实现的用户认证吗,其实还有一个,我们可以用它实现权限控制,这里我们基于RBAC基于用户角色来控制权限, 之前有一个方法没实现,我们现在实现一下:

/**
     * 获取用户角色和权限
     */
    @Override
    protected AuthorizationInfo doGetAuthorizationInfo(PrincipalCollection principal) {
        User user = (User) SecurityUtils.getSubject().getPrincipal();
        String userName = user.getUsername();
        SimpleAuthorizationInfo simpleAuthorizationInfo = new SimpleAuthorizationInfo();
        // 获取用户角色
        Set<String> roleSet = new HashSet<>();
        String role = UserMock.getRole(userName);
        roleSet.add(role);
        simpleAuthorizationInfo.setRoles(roleSet);
        // 获取用户权限
        String permission = UserMock.getPermission(userName);
        Set<String> permissionSet = new HashSet<String>();
        permissionSet.add(permission);
        simpleAuthorizationInfo.setStringPermissions(permissionSet);
        return simpleAuthorizationInfo;
    }
复制代码


开启权限注解

Shiro中,为我们提供了一列好用的注解,我们一起看一下:

// 表示Subject已经通过login身份验证
@RequiresAuthentication  
// 表示当前是用户身份
@RequiresUser  
// 表示当是游客身份。
@RequiresGuest  
// 表示当前需要的角色
@RequiresRoles(value={"admin", "user"}, logical= Logical.AND)  
// 表示当前需要的权限
@RequiresPermissions (value={"p:admin", "p:user"}, logical= Logical.OR)
复制代码


使用它之前,我们需要开启它的注解,怎么做呢?在ShiroConfig中加入:

@Bean
public AuthorizationAttributeSourceAdvisor authorizationAttributeSourceAdvisor(SecurityManager securityManager) {
    AuthorizationAttributeSourceAdvisor authorizationAttributeSourceAdvisor = new AuthorizationAttributeSourceAdvisor();
    authorizationAttributeSourceAdvisor.setSecurityManager(securityManager);
    return authorizationAttributeSourceAdvisor;
}
复制代码


下面直接使用就可以了:

@RestController
public class IndexController {
    @RequiresPermissions("p:user")
    @RequestMapping("/index")
    public String index(Model model) {
        // 登录成后,即可通过Subject获取登录的用户信息
        User user = (User) SecurityUtils.getSubject().getPrincipal();
        model.addAttribute("user", user);
        return "index --->" + user.getUsername();
    }
}
复制代码


这样就可以了, 很简单,大家可以自己运行一下。还有一个疑问❓用户没有权限,我想自定义返回错误信息怎么办呢?很简单,我们一起看一下


权限异常捕获

还记得之前教大家的全局已经捕获吗?没错我们只要在那里加上要捕获的异常类就好了,实际上它是抛出了AuthorizationException的异常

@ControllerAdvice
public class ExceptionController {
    @ExceptionHandler(value = AuthorizationException.class)
    public String handleAuthorizationException() {
        return "您当前没有权限访问~ 请联系管理员";
    }
}
复制代码

这样就可以了~


结束语

本期内容就到这里结束了,总结一下,本节主要讲了Shiro如何进行权限认证以及常用的权限注解,大家可以自己多试试


下期预告

下期给大家讲讲Shiro中如何进行缓存,缓存对于业务来讲还是比较重要的,尤其对于量大的情况下。欢迎加群一起学习交流 ~

相关文章
|
2月前
|
JavaScript Java 应用服务中间件
【JavaEE进阶】 SpringBoot配置⽂件
【JavaEE进阶】 SpringBoot配置⽂件
|
2月前
|
缓存 安全 Java
Shiro框架以及Spring Boot整合Shiro
Shiro框架以及Spring Boot整合Shiro
Shiro框架以及Spring Boot整合Shiro
|
2月前
|
安全 Java Maven
【JavaEE进阶】 SpringBoot的创建与简单使用
【JavaEE进阶】 SpringBoot的创建与简单使用
|
2月前
|
开发框架 安全 Java
【Java专题_01】springboot+Shiro+Jwt整合方案
【Java专题_01】springboot+Shiro+Jwt整合方案
|
2月前
|
Java 关系型数据库 MySQL
Shiro实战+springboot集成
Shiro实战+springboot集成
17 0
|
2月前
|
前端开发 Java 关系型数据库
【Shiro】Springboot集成Shiro
【Shiro】Springboot集成Shiro
57 1
|
3月前
|
安全 Java Spring
springboot整合spring security 实现用户登录注册与鉴权全记录
【1月更文挑战第11天】springboot整合spring security 实现用户登录注册与鉴权全记录
82 2
|
3月前
|
Java
springboot如何配置使用shiro
【1月更文挑战第11天】springboot如何配置使用shiro
18 2
|
3月前
|
存储 Java 数据库
SpringBoot+JWT+Shiro
SpringBoot+JWT+Shiro
30 0
|
12天前
|
Java Linux
Springboot 解决linux服务器下获取不到项目Resources下资源
Springboot 解决linux服务器下获取不到项目Resources下资源