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

yizhihongxing

下面我将详细讲解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日

相关文章

  • 23基于java教师科研项目管理系统

    背景及意义 目前许多人仍将传统的纸质工具作为信息管理的主要工具,而网络技术的应用只是起到辅助作用。在对网络工具的认知程度上,较为传统的office软件等仍是人们使用的主要工具,而相对全面且专业的信息管理软件仍没有得到大多数人的了解或认可。本选题则旨在通过标签分类管理等方式,实现教研的各种功能,从而达到对科研管理系统的管理。 项目环境 > 前端:html…

    Java 2023年5月5日
    00
  • Mybatis常见注解有哪些(总结)

    那么关于“Mybatis常见注解有哪些”,我建议从以下几个方面进行总结: 1. 增删改查注解 在Mybatis中,经常用到的增删改查操作,是可以使用注解方式进行实现的。其中常见的注解有: @Insert: 插入数据,通常与Mapper.xml文件中的Insert标签对应。 @Update: 更新数据,通常与Mapper.xml文件中的Update标签对应。 …

    Java 2023年5月19日
    00
  • 详解如何使用java实现Open Addressing

    详解如何使用Java实现Open Addressing Open Addressing是一种哈希表的实现策略,它可以通过将元素插入到哈希表中直到找到一个为空的插槽。在此过程中,与元素对应的键的哈希值在哈希表中指定其插入的位置。Open Addressing的优点在于只需要一个数组来存储哈希表,而不需要使用链表。 本文将详细介绍如何使用Java实现Open A…

    Java 2023年5月26日
    00
  • Java多种方式实现生产者消费者模式

    实现生产者消费者模式是 Java 多线程编程中的一个重要概念。在多线程环境下,生产者和消费者可以并行执行,提高了程序的效率。这里将详细讲解 Java 多种方式实现生产者消费者模式的完整攻略。 1. 管程法 管程法是最常用的实现生产者消费者模式的方法之一。它要求生产者和消费者共享同一个缓冲区,由缓冲区提供同步的方法供生产者和消费者调用。 以下是管程法的实现示例…

    Java 2023年5月19日
    00
  • Spring Boot 项目发布到 Tomcat 服务器的操作步骤

    下面是Spring Boot项目发布到Tomcat服务器操作步骤的完整攻略: 1. 生成war包 在pom.xml文件中添加如下代码 <packaging>war</packaging> 然后在Maven工具栏中执行Package命令,即可生成war包,一般会在target目录下生成。也可以通过命令行的方式执行mvn clean pa…

    Java 2023年6月2日
    00
  • Spring事务管理的使用细则浅析

    Spring事务管理的使用细则浅析 随着应用程序的复杂度增加,使用事务管理来保证数据的一致性和完整性变得越来越重要。Spring框架提供了一个强大的事务管理机制,可以让我们方便地定义和使用事务。 在本文中,我们将讨论Spring事务管理的使用细则,包括如何配置和使用事务、不同的传播机制、事务的隔离级别和异常处理等方面内容。 配置和使用事务 首先,我们需要配置…

    Java 2023年5月20日
    00
  • 微信小程序wx.request拦截器使用详解

    微信小程序wx.request拦截器使用详解 前言 在微信小程序中,我们有时需要对所有的 HTTP 请求进行统一的拦截或者处理,此时就需要使用到 wx.request 拦截器。在本文中,我们将详细介绍如何使用拦截器来实现统一的请求处理需求。 wx.request 拦截器介绍 wx.request 拦截器是在 2.10.0 版本中新增的功能,通过使用该功能,我…

    Java 2023年5月23日
    00
  • 三分钟带你了解SpringBoot真正的启动引导类

    当我们运行一个SpringBoot应用时,第一个会执行的类就是启动引导类,也就是@SpringBootApplication注解所标注的类。那么,如何理解SpringBoot的启动引导类以及它的实现方式呢?下面是详细的攻略。 什么是启动引导类 启动引导类是一个运行Java程序的入口类。在SpringBoot应用中,启动引导类是使用@SpringBootApp…

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