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日

相关文章

  • 5分钟快速了解String.trim()到底做了什么事

    当我们使用Java字符串时,我们可以使用trim()方法来去除字符串的首尾空格。 一、什么是String.trim()方法? String.trim()方法属于Java String类的一个方法,用于去除字符串的首尾空格。该方法返回一个新的字符串,而不是修改原始字符串。 二、String.trim()方法的使用 在Java编程中,我们可以使用String.t…

    Java 2023年5月20日
    00
  • Java面向对象编程的三大特征

    Java面向对象编程的三大特征分别是封装、继承和多态。下面分别来详细讲解: 封装 封装是面向对象编程的一个非常重要的特征,它是指将数据和方法结合起来,形成一个独立的整体,对外部隐藏对象内部的实现细节。在Java中,通过访问修饰符(public、private、protected)来实现封装。 示例1:下面的代码展示了一个简单的Java类,它使用封装来隐藏内部…

    Java 2023年5月26日
    00
  • java生成自增编号数字的问题

    生成自增编号是Java应用程序开发中经常出现的需求,可以为数据库中的表设置自增主键,也可以为业务中不同种类的数据生成不同的编号。本篇攻略将介绍如何使用Java来实现自增编号。 方案一:使用数据库的自增主键 数据库中可以设置自增主键,通过以下步骤实现: 在数据库中创建自增主键 CREATE TABLE user ( id INT PRIMARY KEY AUT…

    Java 2023年5月20日
    00
  • 详解java 对象锁与类锁

    我们来详细讲解一下 Java 对象锁和类锁。 什么是对象锁? 在 Java 中,每一个对象都有一个锁,也就是监视器锁(Monitor Lock)。当一个线程访问某个对象的 synchronized 方法或 synchronized 块时,这个线程会试图获得这个对象的锁。获得对象锁后,这个线程才能进入 synchronized 方法或 synchronized…

    Java 2023年5月26日
    00
  • jsp hibernate的分页代码第3/3页

    下面是jsp Hibernate的分页代码第3/3页的完整攻略: 分页代码介绍 在开发web应用程序时,常常需要对大量数据进行分页处理,这时我们可以使用JSP和Hibernate的结合来完成分页功能。JSP是Java服务器页面的简称,是一种动态网页技术标准,而Hibernate是一种Java框架,用于简化Java应用程序对关系数据库的访问。 在本文中,我们将…

    Java 2023年6月15日
    00
  • JSP连接Access数据库

    JSP连接Access数据库的过程可以分为以下几个步骤: 1. 安装Access驱动程序 在JSP连接Access数据库之前需要先安装Microsoft Access数据库驱动程序,可以从Microsoft官网下载,并按照说明进行安装。 2. 导入Access数据库到项目中 在JSP项目中创建一个lib文件夹,将Microsoft Access数据库驱动程序…

    Java 2023年6月15日
    00
  • 批处理杨辉三角效果实现代码

    以下是“批处理杨辉三角效果实现代码”的完整攻略,包含了代码实现和示例说明。 批处理杨辉三角效果实现 杨辉三角是一种数学图形,它由排列成三角形的数字构成,起始数字为1,下一行的数字是由上一行相邻数字相加而得出的。在批处理程序中,可以用一系列的数字来实现杨辉三角的效果。 实现代码 下面是一个实现批处理杨辉三角效果的代码示例: @echo off setlocal…

    Java 2023年5月23日
    00
  • Java实现新建有返回值的线程的示例详解

    针对“Java实现新建有返回值的线程”的问题,以下是一个完整的攻略: 1. 背景知识 在 Java 中,我们可以使用继承 Thread 类或实现 Runnable 接口来创建一个线程,具体的实现方法可以参考 “Java中创建线程的几种方式” 文章. 当我们创建一个线程时,如果需要在线程执行完毕后得到返回值,我们可以使用 Callable 接口,它定义了一个具…

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