Spring Boot2开发之Spring Boot整合Shiro两种详细方法

yizhihongxing

SpringBoot2开发之SpringBoot整合Shiro两种详细方法

Shiro是一个强大且易于使用的Java安全框架,可以提供身份验证、授权、加密和会话管理等功能。本文将详细讲解如何在Spring Boot应用程序中整合Shiro,包括两种详细方法。

方法一:使用Shiro Spring Boot Starter

Shiro Spring Boot Starter是一个官方提供的快速集成Shiro的工具。使用该工具可以快速地将Shiro集成到Spring Boot应用程序中。以下是一个示例:

  1. 在pom.xml文件中添加Shiro Spring Boot Starter依赖:
<dependency>
    <groupId>org.apache.shiro</groupId>
    <artifactId>shiro-spring-boot-starter</artifactId>
    <version>1.6.0</version>
</dependency>
  1. 创建一个Shiro配置类:
@Configuration
public class ShiroConfig {
    @Bean
    public ShiroFilterFactoryBean shiroFilterFactoryBean(SecurityManager securityManager) {
        ShiroFilterFactoryBean shiroFilterFactoryBean = new ShiroFilterFactoryBean();
        shiroFilterFactoryBean.setSecurityManager(securityManager);
        Map<String, String> filterChainDefinitionMap = new LinkedHashMap<>();
        filterChainDefinitionMap.put("/login", "anon");
        filterChainDefinitionMap.put("/**", "authc");
        shiroFilterFactoryBean.setFilterChainDefinitionMap(filterChainDefinitionMap);
        return shiroFilterFactoryBean;
    }

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

    @Bean
    public Realm realm() {
        return new MyRealm();
    }
}

在上面的示例中,我们使用@Configuration注解定义了一个名为ShiroConfig的配置类。使用@Bean注解定义了三个Bean:ShiroFilterFactoryBean、SecurityManager和Realm。在ShiroFilterFactoryBean中定义了一个过滤器链,将/login路径设置为匿名访问,其他路径需要进行身份验证。在SecurityManager中设置了Realm。在Realm中定义了身份验证和授权规则。

  1. 创建一个Realm类:
public class MyRealm extends AuthorizingRealm {
    @Override
    protected AuthorizationInfo doGetAuthorizationInfo(PrincipalCollection principals) {
        SimpleAuthorizationInfo authorizationInfo = new SimpleAuthorizationInfo();
        authorizationInfo.addRole("admin");
        authorizationInfo.addStringPermission("user:read");
        return authorizationInfo;
    }

    @Override
    protected AuthenticationInfo doGetAuthenticationInfo(AuthenticationToken token) throws AuthenticationException {
        UsernamePasswordToken usernamePasswordToken = (UsernamePasswordToken) token;
        String username = usernamePasswordToken.getUsername();
        String password = new String(usernamePasswordToken.getPassword());
        if ("admin".equals(username) && "123456".equals(password)) {
            return new SimpleAuthenticationInfo(username, password, getName());
        } else {
            throw new AuthenticationException("用户名或密码错误");
        }
    }
}

在上面的示例中,我们创建了一个名为MyRealm的Realm类,继承了AuthorizingRealm类。在doGetAuthorizationInfo()方法中定义了授权规则,在doGetAuthenticationInfo()方法中定义了身份验证规则。

  1. 创建一个登录接口:
@RestController
public class LoginController {
    @PostMapping("/login")
    public String login(String username, String password) {
        Subject subject = SecurityUtils.getSubject();
        UsernamePasswordToken token = new UsernamePasswordToken(username, password);
        try {
            subject.login(token);
            return "登录成功";
        } catch (AuthenticationException e) {
            return "用户名或密码错误";
        }
    }
}

在上面的示例中,我们创建了一个名为LoginController的RESTful控制器。使用@PostMapping注解定义了一个POST请求处理方法。在该方法中,使用SecurityUtils.getSubject()获取Subject对象,使用UsernamePasswordToken封装用户名和密码,调用subject.login()方法进行身份验证。

方法二:手动集成Shiro

手动集成Shiro需要手动配置Shiro的各个组件,包括SecurityManager、Realm、Filter等。以下是一个示例:

  1. 在pom.xml文件中添加Shiro依赖:
<dependency>
    <groupId>org.apache.shiro</groupId>
    <artifactId>shiro-core</artifactId>
    <version>1.6.0</version>
</dependency>
  1. 创建一个Shiro配置类:
@Configuration
public class ShiroConfig {
    @Bean
    public ShiroFilterFactoryBean shiroFilterFactoryBean(SecurityManager securityManager) {
        ShiroFilterFactoryBean shiroFilterFactoryBean = new ShiroFilterFactoryBean();
        shiroFilterFactoryBean.setSecurityManager(securityManager);
        Map<String, String> filterChainDefinitionMap = new LinkedHashMap<>();
        filterChainDefinitionMap.put("/login", "anon");
        filterChainDefinitionMap.put("/**", "authc");
        shiroFilterFactoryBean.setFilterChainDefinitionMap(filterChainDefinitionMap);
        return shiroFilterFactoryBean;
    }

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

    @Bean
    public Realm realm() {
        return new MyRealm();
    }
}

在上面的示例中,我们使用@Configuration注解定义了一个名为ShiroConfig的配置类。使用@Bean注解定义了三个Bean:ShiroFilterFactoryBean、SecurityManager和Realm。在ShiroFilterFactoryBean中定义了一个过滤器链,将/login路径设置为匿名访问,其他路径需要进行身份验证。在SecurityManager中设置了Realm。在Realm中定义了身份验证和授权规则。

  1. 创建一个Realm类:
public class MyRealm extends AuthorizingRealm {
    @Override
    protected AuthorizationInfo doGetAuthorizationInfo(PrincipalCollection principals) {
        SimpleAuthorizationInfo authorizationInfo = new SimpleAuthorizationInfo();
        authorizationInfo.addRole("admin");
        authorizationInfo.addStringPermission("user:read");
        return authorizationInfo;
    }

    @Override
    protected AuthenticationInfo doGetAuthenticationInfo(AuthenticationToken token) throws AuthenticationException {
        UsernamePasswordToken usernamePasswordToken = (UsernamePasswordToken) token;
        String username = usernamePasswordToken.getUsername();
        String password = new String(usernamePasswordToken.getPassword());
        if ("admin".equals(username) && "123456".equals(password)) {
            return new SimpleAuthenticationInfo(username, password, getName());
        } else {
            throw new AuthenticationException("用户名或密码错误");
        }
    }
}

在上面的示例中,我们创建了一个名为MyRealm的Realm类,继承了AuthorizingRealm类。在doGetAuthorizationInfo()方法中定义了授权规则,在doGetAuthenticationInfo()方法中定义了身份验证规则。

  1. 创建一个登录接口:
@RestController
public class LoginController {
    @PostMapping("/login")
    public String login(String username, String password) {
        Subject subject = SecurityUtils.getSubject();
        UsernamePasswordToken token = new UsernamePasswordToken(username, password);
        try {
            subject.login(token);
            return "登录成功";
        } catch (AuthenticationException e) {
            return "用户名或密码错误";
        }
    }
}

在上面的示例中,我们创建了一个名为LoginController的RESTful控制器。使用@PostMapping注解定义了一个POST请求处理方法。在该方法中,使用SecurityUtils.getSubject()获取Subject对象,使用UsernamePasswordToken封装用户名和密码,调用subject.login()方法进行身份验证。

总结

在本文中,我们详细讲解了两种方法如何在Spring Boot应用程序中整合Shiro,包括使用Shiro Spring Boot Starter和手动集成Shiro。同时,我们提供了多个示例,演示了如何实现身份验证和授权。这些技巧可以帮助您更好地使用Shiro保护您的应用程序。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:Spring Boot2开发之Spring Boot整合Shiro两种详细方法 - Python技术站

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

相关文章

  • Spring Boot启动及退出加载项的方法

    一、SpringBoot启动及退出加载项的方法 SpringBoot是Spring开发的一款快速应用开发框架,其内置了很多工具和插件,可以让我们非常方便地进行开发。当我们启动SpringBoot应用时,会默认加载一些列的启动项,而这些启动项实际上也是可以自定义的。同样地,当我们停止SpringBoot应用时,也会默认执行一些列的退出项,这些退出项也同样是可以…

    Java 2023年5月15日
    00
  • JavaScript入门之对象与JSON详解

    JavaScript入门之对象与JSON详解 1. 什么是对象 对象是一种复合值,将很多值(原始类型或另一个对象)集合在一起,可以方便地组织和管理这些值。 2. 对象的创建 2.1 对象字面量创建对象 对象字面量是表示对象的最简洁方式之一,由一堆用逗号隔开的 名/值 对 组成,逗号后面的属性值可以是任意合法的JavaScript表达式。 示例1: let s…

    Java 2023年5月26日
    00
  • 学习不同 Java.net 语言中类似的函数结构

    学习不同Java.net语言中类似的函数结构,可以遵循以下攻略: 第一步:了解Java.net语言中的常见函数结构 在Java.net语言中,常见的函数结构有方法的声明、方法的参数、方法的返回值等。方法的声明包括方法名、访问修饰符、返回值类型和方法的参数类型等。方法的参数包括形式参数、实际参数和默认值等。方法的返回值包括返回值类型、返回值关键字和返回值的值等…

    Java 2023年5月26日
    00
  • 通过Java实现文件断点续传功能

    关于“通过Java实现文件断点续传功能”的攻略,我整理了以下步骤: 一、概述 在进行大文件的上传或下载时,考虑到网络环境以及其他因素,导致可能会出现网络中断、程序崩溃等情况,从而造成上传或下载任务无法完成。为了保证文件上传或下载任务不会因为因为网络等问题进行重头开始,可以通过实现文件的断点续传功能来解决这个问题。文件的断点续传功能可以实现将文件分成多个块,每…

    Java 2023年5月31日
    00
  • Spring MVC实现mysql数据库增删改查完整实例

    以下是关于“Spring MVC实现MySQL数据库增删改查完整实例”的完整攻略,其中包含两个示例。 Spring MVC实现MySQL数据库增删改查完整实例 在Spring MVC中,我们可以使用JdbcTemplate类来实现MySQL数据库的增删改查操作。在本文中,我们将讲解如何使用JdbcTemplate类来实现MySQL数据库的增删改查操作。 My…

    Java 2023年5月17日
    00
  • Java语言class类用法及泛化(详解)

    Java语言class类用法及泛化(详解) 什么是class类? 在Java语言中,每个对象都是一个类(class)的实例。一个类是一个模板,它定义了一个对象的属性和方法。Java中的class类表示对象和类的结构,包括类的成员变量和成员方法。使用Java的class类可以动态地创建和加载类,并查看一个类的成员变量和成员方法。 class类的基本用法 在Ja…

    Java 2023年5月26日
    00
  • 详解Java的Hibernate框架中的搜索工具的运用

    详解Java的Hibernate框架中的搜索工具的运用 什么是Hibernate框架 Hibernate框架是一个Java对象关系映射框架,简称ORM框架。它提供了将Java对象映射到数据库中关系表的支持,从而让开发人员在代码中更加直观地操作数据库。 什么是Hibernate搜索工具 Hibernate搜索工具是一个用于全文搜索的Java库,它允许开发人员将…

    Java 2023年5月20日
    00
  • SpringBoot个性化配置的方法步骤

    Spring Boot 个性化配置的方法步骤 在 Spring Boot 中,我们可以使用个性化配置来覆盖默认的配置。个性化配置可以帮助我们在不修改默认配置的情况下,对应用程序进行自定义配置。在本文中,我们将详细介绍 Spring Boot 个性化配置的方法步骤,并提供两个示例。 方法步骤 以下是 Spring Boot 个性化配置的方法步骤: 创建一个名为…

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