SpringBoot整合Shiro实现权限控制的代码实现

下面我将为您详细讲解“SpringBoot整合Shiro实现权限控制的代码实现”的完整攻略,主要分为以下几个步骤:

1. 引入相关依赖

在 pom.xml 中添加以下依赖:

<dependencies>
    <!-- SpringBoot相关依赖 -->
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-web</artifactId>
    </dependency>

    <!-- Shiro相关依赖 -->
    <dependency>
        <groupId>org.apache.shiro</groupId>
        <artifactId>shiro-spring</artifactId>
        <version>1.6.0</version>
    </dependency>

    <!-- lombok -->
    <dependency>
        <groupId>org.projectlombok</groupId>
        <artifactId>lombok</artifactId>
        <optional>true</optional>
    </dependency>
</dependencies>

2. 配置Shiro

在 application.yml 中添加以下配置:

# Shiro配置
shiro:
  # 登录地址
  loginUrl: /login
  # 权限拒绝时重定向的地址
  unauthorizedUrl: /403
  # ShiroFilter配置
  filterChainDefinitions: 
    /login: anon
    /logout: anon
    /**: authc
  # 自定义Realm
  realm:
    type: com.example.shirodemo.shiro.MyRealm

3. 自定义Realm

我们需要自定义一个 Realm 类,继承 AuthorizingRealm 类,实现其 doGetAuthorizationInfo 和 doGetAuthenticationInfo 两个方法,这两个方法分别用于授权和认证。

以下是示例代码:

@Slf4j
public class MyRealm extends AuthorizingRealm {

    /**
     * 授权
     *
     * @param principals
     * @return
     */
    @Override
    protected AuthorizationInfo doGetAuthorizationInfo(PrincipalCollection principals) {
        SimpleAuthorizationInfo authorizationInfo = new SimpleAuthorizationInfo();
        // 添加授权信息
        authorizationInfo.addRole("admin");
        authorizationInfo.addStringPermission("user:create");
        authorizationInfo.addStringPermission("user:update");
        return authorizationInfo;
    }

    /**
     * 认证
     *
     * @param authenticationToken
     * @return
     * @throws AuthenticationException
     */
    @Override
    protected AuthenticationInfo doGetAuthenticationInfo(AuthenticationToken authenticationToken)
            throws AuthenticationException {
        log.info("doGetAuthenticationInfo:" + authenticationToken);

        // 根据用户名获取用户信息
        String username = authenticationToken.getPrincipal().toString();
        // 这里模拟数据库中的密码
        String password = "123456";

        if (StringUtils.isEmpty(username)) {
            throw new AccountException("用户名不能为空");
        }

        // 密码认证
        SimpleAuthenticationInfo authenticationInfo = new SimpleAuthenticationInfo(username, password, getName());
        return authenticationInfo;
    }
}

4. 编写Controller

编写一个简单的Controller做测试:

@Slf4j
@RestController
@RequestMapping("/user")
public class UserController {

    @GetMapping("/create")
    public String createUser() {
        log.info("createUser...");
        return "createUser...";
    }

    @GetMapping("/update")
    public String updateUser() {
        log.info("updateUser...");
        return "updateUser...";
    }
}

5. 测试

启动应用,访问 http://localhost:8080/login 进行登录,登录成功后再访问 http://localhost:8080/user/create,将会因为没有 user:create 授权而被拒绝,跳转到 403 页面。

以上就是 SpringBoot 整合 Shiro 实现权限控制的完整攻略。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:SpringBoot整合Shiro实现权限控制的代码实现 - Python技术站

(0)
上一篇 2023年5月20日
下一篇 2023年5月20日

相关文章

  • java获取微信accessToken的方法

    Java获取微信accessToken的方法 微信accessToken是通过微信公众平台开发者中心生成的,用于公众号的基础服务。通过接口获取accessToken可以进行一些高级接口的操作。本文主要介绍在Java中如何获取微信accessToken。 1. 请求微信接口获取accessToken 1.1 请求地址 微信接口请求地址:https://api.…

    Java 2023年5月23日
    00
  • 深入了解MyBatis参数

    深入了解MyBatis参数 MyBatis是一款优秀的数据库持久化框架,在使用过程中主要涉及到参数的设置和传递。深入了解MyBatis参数对于提高MyBatis的性能和灵活性非常重要。 1. 参数的传递 MyBatis支持三种方式的参数传递: 1.1. 单个参数 单个参数是指只传递一个参数,使用最为简单。 Java代码 public interface Us…

    Java 2023年5月20日
    00
  • Spring ProtocolResolver策略接口示例

    下面我给出关于Spring ProtocolResolver策略接口示例的详细攻略。 策略接口概述 在Spring框架中,策略(Strategy)模式是一种常见的设计模式,它可以将不同的实现算法封装在不同的策略类中,并且这些策略类可以互相替换。Spring框架充分利用了策略模式的优势,因为它可以将不同的实现逻辑分离开来,使得代码更加灵活和可扩展。 Proto…

    Java 2023年5月23日
    00
  • java结束进程的实例代码

    下面是“Java结束进程的实例代码”完整攻略。 标题:Java结束进程的实例代码 介绍 有时候,在Java应用程序中,我们需要结束一个进程。一种常见的情况是,当我们在一个死循环中运行代码时,我们需要手动中断程序。本文将介绍如何在Java中结束进程,并提供一些实例代码以帮助您更好地理解。 使用System.exit(int status)方法结束进程 Java…

    Java 2023年5月23日
    00
  • Jsp生成页面验证码的方法[附代码]

    让我来详细讲解一下“Jsp生成页面验证码的方法[附代码]”。 1. 简介 验证码(Captcha)是一种常见的图形验证码,用于防止恶意攻击和自动化机器人下载。在 JSP 网站设计的过程中,JavaWeb 的技术基本上都使用了验证码,验证方式很多,确保了 JSP 网站的安全性和性能。 2. 生成验证码示例 下面是一个简单的 JSP 页面,展示了如何使用 Jav…

    Java 2023年6月15日
    00
  • 详解Spring连接数据库的几种常用的方式

    详解Spring连接数据库的几种常用方式 Spring框架是当今最流行的Java应用程序框架之一。在开发Java应用程序时,通常需要使用数据库来存储和检索数据。Spring框架提供了多种连接数据库的方式,本文将介绍这些常用的连接方式。 1. 数据库连接配置 在使用Spring连接数据库之前,我们需要做一些配置。下面是一个代表数据库配置的示例文件applica…

    Java 2023年5月20日
    00
  • 如何通过Java代码实现KMP算法

    下面我将为你讲解“如何通过Java代码实现KMP算法”的完整攻略。 1. 什么是KMP算法? KMP算法是一种字符串匹配算法,其全称是Knuth-Morris-Pratt算法,其主要思想是在匹配过程中充分利用已知信息,尽可能地减少比较次数,从而达到快速匹配的目的。 2. KMP算法的实现过程 2.1 计算字符串的next数组 在KMP算法中,关键在于如何计算…

    Java 2023年5月18日
    00
  • 基于javassist进行动态编程过程解析

    “基于javassist进行动态编程过程解析”攻略 什么是javassist? Javassist是一个开源的字节码编辑库,它可以在运行时修改类或接口的字节码。使用Javassist,我们可以实现很多有趣的功能,例如创建代理、AOP拦截、以及动态创建新类等。 javassist的基本用法 下面是使用javassist的基本步骤: 引入javassist库 获…

    Java 2023年5月20日
    00
合作推广
合作推广
分享本页
返回顶部