springboot2.x整合shiro权限框架的使用

下面我将详细讲解springboot2.x整合shiro权限框架的使用的完整攻略。

一、前置知识

在学习springboot2.x整合shiro权限框架之前,需对以下知识点进行了解:

  1. Spring框架

  2. SpringMVC框架

  3. Maven工具

  4. Shiro框架

二、整合步骤

1.创建Springboot工程

在Maven中新建一个springboot项目,添加web和thymeleaf依赖,并引入shiro依赖。

<dependency>
    <groupId>org.apache.shiro</groupId>
    <artifactId>shiro-spring</artifactId>
    <version>1.7.0</version>
</dependency>

2.配置Shiro

在Springboot中使用Shiro需要对Shiro进行配置,创建ShiroConfig配置类,并使用注解@Configuration和@ImportResource引入shiro.ini文件。

@Configuration
@ImportResource(locations = { "classpath:shiro.ini" })
public class ShiroConfig {

}

3.添加自定义Realm

自定义Realm是Shiro进行权限验证的关键所在,我们需要继承org.apache.shiro.realm.Realm接口并实现其中的方法,进行用户身份认证和用户授权验证。

public class MyRealm implements Realm {

    @Autowired
    private UserService userService;

    @Override
    public String getName() {
        return "MyRealm";
    }

    @Override
    public boolean supports(AuthenticationToken token) {
        return token instanceof UsernamePasswordToken;
    }

    @Override
    public AuthenticationInfo getAuthenticationInfo(AuthenticationToken token) throws AuthenticationException {
        String username = token.getPrincipal().toString();
        User user = userService.findByName(username);
        if (user == null) {
            throw new UnknownAccountException();
        }
        return new SimpleAuthenticationInfo(user.getUsername(), user.getPassword(), getName());
    }

    @Override
    public AuthorizationInfo getAuthorizationInfo(PrincipalCollection principals) {
        SimpleAuthorizationInfo info = new SimpleAuthorizationInfo();
        User user = userService.findByName(principals.getPrimaryPrincipal().toString());
        info.addRoles(user.getRoleList());
        info.addStringPermissions(user.getPermissionList());
        return info;
    }

}

4.配置SecurityManager

在ShiroConfig配置类中添加SecurityManager,并将自定义Realm添加到SecurityManager中。

@Bean
public SecurityManager securityManager() {
    DefaultWebSecurityManager securityManager = new DefaultWebSecurityManager();
    securityManager.setRealm(myRealm());
    return securityManager;
}

@Bean
public MyRealm myRealm() {
    return new MyRealm();
}

5.配置Shiro的过滤器

对于不同的请求进行不同的权限验证,可以使用Shiro的过滤器。我们可以通过配置ShiroFilterFactoryBean来实现。

@Bean
public ShiroFilterFactoryBean shiroFilterFactoryBean(SecurityManager securityManager) {
    ShiroFilterFactoryBean factoryBean = new ShiroFilterFactoryBean();
    factoryBean.setSecurityManager(securityManager);

    Map<String, String> filterChainDefinitionMap = new LinkedHashMap<>();
    filterChainDefinitionMap.put("/", "anon");
    filterChainDefinitionMap.put("/login", "anon");
    filterChainDefinitionMap.put("/logout", "logout");
    filterChainDefinitionMap.put("/admin/**", "roles[admin]");
    filterChainDefinitionMap.put("/**", "authc");

    factoryBean.setFilterChainDefinitionMap(filterChainDefinitionMap);

    factoryBean.setLoginUrl("/login");
    factoryBean.setSuccessUrl("/index");
    factoryBean.setUnauthorizedUrl("/unauthorized");

    return factoryBean;
}

6.编写登录页面和授权页面

完成Shiro权限框架的配置之后,我们需要编写登录页面和授权页面,这里使用Thymeleaf模板引擎编写。

登录页面login.html:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>登录</title>
</head>
<body>
    <form action="/login" method="post">
        <input type="text" name="username" placeholder="用户名">
        <input type="password" name="password" placeholder="密码">
        <button type="submit">登录</button>
    </form>
</body>
</html>

授权页面index.html:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>授权页面</title>
</head>
<body>
    <h1>欢迎访问授权页面</h1>
</body>
</html>

7.编写Controller

编写登录Controller和授权Controller。

登录Controller:

@Controller
public class LoginController {

    @GetMapping("/login")
    public String login() {
        return "login";
    }

    @PostMapping("/login")
    public String checkLogin(String username, String password) {
        Subject subject = SecurityUtils.getSubject();
        UsernamePasswordToken token = new UsernamePasswordToken(username, password);
        try {
            subject.login(token);
            return "redirect:/index";
        } catch (Exception e) {
            return "redirect:/login";
        }
    }

    @GetMapping("/logout")
    public String logout() {
        Subject subject = SecurityUtils.getSubject();
        subject.logout();
        return "redirect:/login";
    }

}

授权Controller:

@Controller
public class IndexController {

    @GetMapping("/index")
    public String index() {
        return "index";
    }

    @GetMapping("/admin")
    public String admin() {
        return "admin";
    }

}

8.运行程序

完成上述步骤,我们就可以运行程序,输入正确用户名和密码可以访问授权页面,输入错误用户名和密码则跳转到登录页面。

三、示例

下面提供两个示例帮助理解整合过程:

示例一:shiro.ini配置文件

[users]
zhangsan = 123456, user
lisi = 123456, admin

[roles]
admin = *

[urls]
/admin/** = roles[admin]
/** = authc

示例二:自定义Realm

public class MyRealm implements Realm {

    @Autowired
    private UserService userService;

    @Override
    public String getName() {
        return "MyRealm";
    }

    @Override
    public boolean supports(AuthenticationToken token) {
        return token instanceof UsernamePasswordToken;
    }

    @Override
    public AuthenticationInfo getAuthenticationInfo(AuthenticationToken token) throws AuthenticationException {
        String username = token.getPrincipal().toString();
        User user = userService.findByName(username);
        if (user == null) {
            throw new UnknownAccountException();
        }
        return new SimpleAuthenticationInfo(user.getUsername(), user.getPassword(), getName());
    }

    @Override
    public AuthorizationInfo getAuthorizationInfo(PrincipalCollection principals) {
        SimpleAuthorizationInfo info = new SimpleAuthorizationInfo();
        User user = userService.findByName(principals.getPrimaryPrincipal().toString());
        info.addRoles(user.getRoleList());
        info.addStringPermissions(user.getPermissionList());
        return info;
    }

}

以上就是springboot2.x整合shiro权限框架的使用的完整攻略。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:springboot2.x整合shiro权限框架的使用 - Python技术站

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

相关文章

  • Java的Struts框架报错“ControllerResourcesNotFoundException”的原因与解决办法

    当使用Java的Struts框架时,可能会遇到“ControllerResourcesNotFoundException”错误。这个错误通常由以下原因之一起: 配置错误:如果配置文件中没有正确配置,则可能会出现此错误。在这种情况下,需要检查文件以解决此问题。 控制器错误:如果控制器不正确,则可能会出现此错误。在这种情况下,需要检查控制器以解决此问题。 以下是…

    Java 2023年5月5日
    00
  • springboot使用外置tomcat启动方式

    下面是关于“springboot使用外置tomcat启动方式”的完整攻略。 1. 准备工作 在开始使用外置tomcat启动SpringBoot应用之前,需要先进行一些准备工作。 1.1 确认Tomcat版本 确保Tomcat版本符合SpringBoot版本要求。可以通过SpringBoot官方文档中的 Supported Application Server…

    Java 2023年5月19日
    00
  • 浅谈java中String的两种赋值方式的区别

    下面是详细的攻略: 标题 浅谈Java中String的两种赋值方式的区别 简介 在Java编程中,经常要用到字符串类型。字符串在Java中是一个非常重要的数据类型,工作中经常会使用到。对于String类型的赋值方式,有两种方式,分别是直接赋值和通过new关键字创建字符串对象进行赋值。这两种方式在使用时有一些区别,需要我们进行了解和掌握。 直接赋值 直接赋值是…

    Java 2023年5月27日
    00
  • java二维数组遍历的2种代码

    下面是详细讲解“Java二维数组遍历的2种代码”的完整攻略。 什么是二维数组 二维数组是指数组中包含另一个数组序列的数组。它是一种存储表格数据的有效方式。Java 二维数组是一个矩阵式的数组,数据被组织成了行和列,因此每个元素在矩阵中都有自己的位置。 Java二维数组遍历的2种代码 1. 使用双重for循环遍历 int[][] arr = {{1,2,3},…

    Java 2023年5月27日
    00
  • java实现日历(某年的日历,某月的日历)用户完全自定义

    实现Java日历需要用到以下几个方面的知识: 日期和时间类:Java中有java.util.Date和java.util.Calendar类,但这些类已经被Java 8中的全新日期和时间API(Java.time)所取代,建议使用新API。 控制台输出:Java中有System.out.println()方法可以将内容输出到控制台。 用户输入:Java中有S…

    Java 2023年5月20日
    00
  • 每日六道java新手入门面试题,通往自由的道路–JVM

    每日六道Java新手入门面试题,通往自由的道路 – JVM 概述 毎天解答 Java 相关的面试题,从基础开始逐步深入,让新手们熟悉和理解 Java 的运行原理,从而更好地掌握该编程语言。其中,JVM 是一个重要的话题,本文将详细讲解如何攻略每日六道Java新手入门面试题,重点讲解 JVM 部分。 JVM JVM(Java Virtual Machine,J…

    Java 2023年5月19日
    00
  • 解决zuulGateway网关添加路由异常熔断问题

    解决zuulGateway网关添加路由异常熔断问题 在使用zuulGateway网关时,我们经常需要通过动态添加路由的方式来实现API转发。然而,在高并发或者复杂路由规则时,动态添加路由可能会引发Unexpected error in route导致熔断。本文将详细介绍如何通过修改zuulGateway配置来解决该问题。 问题描述 在使用zuulGatewa…

    Java 2023年5月26日
    00
  • 详解Java中ByteArray字节数组的输入输出流的用法

    详解Java中ByteArray字节数组的输入输出流的用法 什么是ByteArray字节数组? 在Java中,字节数组是指由若干个字节所组成的数组。字节一般是指8位二进制数,也就是一个范围在0-255的整数,因此Java中一个字节数组就是由一系列整数所组成的数组。 什么是Java中的输入输出流? Java中的输入输出流是用来实现数据的流动,将数据从输入端流入…

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