Spring Boot 如何使用 Shiro 进行认证和授权

文章介绍了如何在SpringBoot应用中使用ApacheShiro进行用户认证和权限授权,包括添加Shiro依赖、配置SecurityManager、定义URL访问规则以及创建INI配置文件来设置用户和角色。

Spring Boot 如何使用 Shiro 进行认证和授权

在 Web 应用程序中,认证和授权是非常重要的功能。Apache Shiro 是一个基于 Java 的安全框架,它提供了完整的认证和授权解决方案,并且可以轻松地集成到 Spring Boot 应用程序中。本文将介绍如何在 Spring Boot 中使用 Shiro 进行认证和授权,并提供示例代码。

在这里插入图片描述

添加 Shiro 依赖

首先,我们需要在 pom.xml 文件中添加 Shiro 依赖:

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

在上面的依赖中,我们添加了 shiro-spring 依赖,它包含了 Shiro 的所有必要依赖。

配置 Shiro

接下来,我们需要配置 Shiro。在 Spring Boot 应用程序中,可以使用 Java 配置或 XML 配置来配置 Shiro。在本文中,我们将使用 Java 配置。

我们需要创建一个名为 ShiroConfig 的类,并添加 @Configuration@Slf4j 注解。这个注解启用了 Shiro,并自动配置了基本的安全性。

@Configuration
@Slf4j
public class ShiroConfig {
    
}

接下来,我们可以创建一个 SecurityManager,并将其注入到 Spring 容器中。在这里,我们使用了 IniRealm,它使用 INI 配置文件来定义用户和角色。

@Configuration
@Slf4j
public class ShiroConfig {
    
    @Bean
    public SecurityManager securityManager() {
        DefaultWebSecurityManager securityManager = new DefaultWebSecurityManager();
        securityManager.setRealm(new IniRealm("classpath:shiro.ini"));
        return securityManager;
    }
    
}

在上面的代码中,我们创建了一个名为 securityManager 的 Bean,它是一个 DefaultWebSecurityManager。我们将 IniRealm 设置为其 Realm,并将 INI 配置文件设置为 classpath:shiro.ini

接下来,我们需要配置 Shiro 的 Web 安全性。我们可以创建一个名为 ShiroFilterChainDefinition 的 Bean,并使用 ShiroFilterFactoryBean 来配置 URL 的访问规则。

@Configuration
@Slf4j
public class ShiroConfig {
    
    // ... 上面的代码
    
    @Bean
    public ShiroFilterChainDefinition shiroFilterChainDefinition() {
        DefaultShiroFilterChainDefinition chainDefinition = new DefaultShiroFilterChainDefinition();
        chainDefinition.addPathDefinition("/login", "anon");
        chainDefinition.addPathDefinition("/logout", "logout");
        chainDefinition.addPathDefinition("/**", "authc");
        return chainDefinition;
    }
    
    @Bean
    public ShiroFilterFactoryBean shiroFilter(SecurityManager securityManager, 
        ShiroFilterChainDefinition shiroFilterChainDefinition) {
        ShiroFilterFactoryBean shiroFilterFactoryBean = new ShiroFilterFactoryBean();
        shiroFilterFactoryBean.setSecurityManager(securityManager);
        shiroFilterFactoryBean.setFilterChainDefinitionMap(shiroFilterChainDefinition.getFilterChainMap());
        shiroFilterFactoryBean.setLoginUrl("/login");
        shiroFilterFactoryBean.setUnauthorizedUrl("/unauthorized");
        return shiroFilterFactoryBean;
    }
    
}

在上面的代码中,我们创建了两个 Bean:shiroFilterChainDefinitionshiroFilter

shiroFilterChainDefinition 定义了 URL 的访问规则。我们允许所有用户访问 /login 路径,允许已经认证的用户访问其他所有路径,而 /logout 路径用于注销。

shiroFilter 定义了 Shiro 的 Filter,它是一个 ShiroFilterFactoryBean。我们将 SecurityManager 设置为其安全管理器,并将 shiroFilterChainDefinition 中定义的 URL 访问规则设置为其过滤器链。我们还设置了登录和未授权的 URL。

示例代码

下面是一个完整的示例代码,演示了如何在 Spring Boot中使用 Shiro 进行认证和授权。

首先,我们需要创建一个名为 UserController 的控制器,它包含了两个路由:/login/logout

@RestController
public class UserController {
    
    @GetMapping("/login")
    public String login() {
        return "Login page";
    }
    
    @GetMapping("/logout")
    public String logout() {
        return "Logout page";
    }
    
}

接下来,我们需要创建一个 INI 配置文件,定义用户和角色。在本例中,我们定义了一个名为 user 的用户,密码为 password,并将其分配到 user 角色。

[users]
user=password,user

[roles]
user=user:*

最后,我们需要启用 Shiro,将其配置为使用我们的 ShiroConfig 类,并添加 @EnableWebSecurity 注解。

@SpringBootApplication
@EnableWebSecurity
public class Application {

    public static void main(String[] args) {
        SpringApplication.run(Application.class, args);
    }

}

现在,我们可以启动应用程序,并尝试访问受保护的 URL。如果用户未经过身份验证,将被重定向到 /login 路径。如果用户尝试访问未授权的 URL,将被重定向到 /unauthorized 路径。

总结

在本文中,我们介绍了如何在 Spring Boot 应用程序中使用 Shiro 进行认证和授权。我们通过添加 Shiro 依赖、配置 Shiro、创建控制器和 INI 配置文件,并启用 Shiro 来完成了这项任务。现在,您可以轻松地将 Shiro 集成到您的应用程序中,并使用其提供的丰富的安全功能来保护您的应用程序。

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

stormjun

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值