前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >Spring Boot中集成Shiro(十)

Spring Boot中集成Shiro(十)

作者头像
默 语
发布2024-11-20 17:02:51
发布2024-11-20 17:02:51
38800
代码可运行
举报
文章被收录于专栏:JAVAJAVA
运行总次数:0
代码可运行

🛡️ Spring Boot中集成Shiro:全面指南 🚀

摘要

大家好,我是默语,一个专注于技术分享的博主。今天我们来探讨 Spring Boot中集成Shiro 的话题。在现代Web应用中,安全性是一个关键问题。Apache Shiro 是一个强大且灵活的Java安全框架,可以轻松地处理身份验证、授权、企业会话管理和加密。在这篇文章中,我们将深入探讨Shiro的核心组件,如何在Spring Boot项目中集成Shiro,包括依赖导入、数据库表数据初始化、自定义Realm以及Shiro配置。通过这篇文章,您将掌握Spring Boot与Shiro集成的关键技术,提升应用的安全性。让我们开始吧!💪

引言

随着Web应用的复杂性增加,安全性成为开发过程中至关重要的一环。Apache Shiro作为一个强大的安全框架,提供了简洁而强大的API,用于处理身份验证和授权。在本指南中,我们将详细介绍如何在Spring Boot项目中集成Shiro,并展示相关代码示例,帮助您轻松实现用户身份认证和权限管理。

正文内容

1. Spring Boot中集成Shiro
1.1 Shiro三大核心组件
1.1.1 Shiro身份和权限认证

Apache Shiro的核心是身份和权限认证。它通过三个主要组件来实现:

  1. Subject:代表当前用户或应用程序与安全框架交互的主体。
  2. SecurityManager:管理所有Subject的安全操作,是Shiro的核心组件。
  3. Realms:从数据源中获取用户和权限信息,用于验证和授权。
1.1.2 Shiro身份认证

身份认证是指确认用户身份的过程,通常通过用户名和密码来实现。Shiro通过调用Realm来验证用户提供的凭证。

1.1.3 Shiro权限认证

权限认证是指确认用户是否有权执行某个操作或访问某个资源。Shiro通过配置权限和角色来管理用户的访问权限。

1.2 Spring Boot集成Shiro过程
1.2.1 依赖导入

首先,在Spring Boot项目的pom.xml文件中添加Shiro的依赖:

代码语言:javascript
代码运行次数:0
运行
复制
<dependency>
    <groupId>org.apache.shiro</groupId>
    <artifactId>shiro-spring</artifactId>
    <version>1.8.0</version>
</dependency>
1.2.2 数据库表数据初始化

为了实现身份认证和权限管理,我们需要在数据库中存储用户和角色信息。创建以下数据库表:

代码语言:javascript
代码运行次数:0
运行
复制
CREATE TABLE users (
    id BIGINT AUTO_INCREMENT PRIMARY KEY,
    username VARCHAR(50) NOT NULL UNIQUE,
    password VARCHAR(100) NOT NULL
);

CREATE TABLE roles (
    id BIGINT AUTO_INCREMENT PRIMARY KEY,
    name VARCHAR(50) NOT NULL UNIQUE
);

CREATE TABLE user_roles (
    user_id BIGINT NOT NULL,
    role_id BIGINT NOT NULL,
    FOREIGN KEY (user_id) REFERENCES users(id),
    FOREIGN KEY (role_id) REFERENCES roles(id)
);

CREATE TABLE permissions (
    id BIGINT AUTO_INCREMENT PRIMARY KEY,
    name VARCHAR(50) NOT NULL UNIQUE
);

CREATE TABLE role_permissions (
    role_id BIGINT NOT NULL,
    permission_id BIGINT NOT NULL,
    FOREIGN KEY (role_id) REFERENCES roles(id),
    FOREIGN KEY (permission_id) REFERENCES permissions(id)
);
1.2.3 自定义Realm

我们需要自定义一个Realm来处理身份验证和授权逻辑:

代码语言:javascript
代码运行次数:0
运行
复制
import org.apache.shiro.authc.*;
import org.apache.shiro.authz.AuthorizationInfo;
import org.apache.shiro.authz.SimpleAuthorizationInfo;
import org.apache.shiro.realm.AuthorizingRealm;
import org.apache.shiro.subject.PrincipalCollection;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;

@Component
public class CustomRealm extends AuthorizingRealm {

    @Autowired
    private UserService userService;

    @Override
    protected AuthorizationInfo doGetAuthorizationInfo(PrincipalCollection principals) {
        String username = (String) principals.getPrimaryPrincipal();
        SimpleAuthorizationInfo authorizationInfo = new SimpleAuthorizationInfo();
        authorizationInfo.setRoles(userService.findRoles(username));
        authorizationInfo.setStringPermissions(userService.findPermissions(username));
        return authorizationInfo;
    }

    @Override
    protected AuthenticationInfo doGetAuthenticationInfo(AuthenticationToken token) throws AuthenticationException {
        String username = (String) token.getPrincipal();
        String password = userService.findPasswordByUsername(username);
        if (password == null) {
            throw new UnknownAccountException("Username not found");
        }
        return new SimpleAuthenticationInfo(username, password, getName());
    }
}
1.2.4 Shiro配置

在Spring Boot项目中配置Shiro:

代码语言:javascript
代码运行次数:0
运行
复制
import org.apache.shiro.mgt.SecurityManager;
import org.apache.shiro.spring.web.ShiroFilterFactoryBean;
import org.apache.shiro.web.mgt.DefaultWebSecurityManager;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

@Configuration
public class ShiroConfig {

    @Bean
    public ShiroFilterFactoryBean shiroFilter(SecurityManager securityManager) {
        ShiroFilterFactoryBean shiroFilterFactoryBean = new ShiroFilterFactoryBean();
        shiroFilterFactoryBean.setSecurityManager(securityManager);
        shiroFilterFactoryBean.setLoginUrl("/login");
        shiroFilterFactoryBean.setSuccessUrl("/index");
        shiroFilterFactoryBean.setUnauthorizedUrl("/403");

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

        shiroFilterFactoryBean.setFilterChainDefinitionMap(filterChainDefinitionMap);
        return shiroFilterFactoryBean;
    }

    @Bean
    public SecurityManager securityManager(CustomRealm customRealm) {
        DefaultWebSecurityManager securityManager = new DefaultWebSecurityManager();
        securityManager.setRealm(customRealm);
        return securityManager;
    }
}
1.2.5 使用Shiro进行认证

在Controller中使用Shiro进行认证:

代码语言:javascript
代码运行次数:0
运行
复制
import org.apache.shiro.SecurityUtils;
import org.apache.shiro.authc.UsernamePasswordToken;
import org.apache.shiro.subject.Subject;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;

@RestController
public class LoginController {

    @PostMapping("/login")
    public String login(@RequestParam String username, @RequestParam String password) {
        Subject subject = SecurityUtils.getSubject();
        UsernamePasswordToken token = new UsernamePasswordToken(username, password);
        try {
            subject.login(token);
            return "Login successful";
        } catch (Exception e) {
            return "Login failed: " + e.getMessage();
        }
    }
}
🤔 QA环节

Q: 什么是Apache Shiro?

A: Apache Shiro是一个强大的Java安全框架,用于处理身份验证、授权、会话管理和加密。它提供了简洁而强大的API,易于集成到各种Java应用中。

Q: Shiro与Spring Security有何不同?

A: Shiro和Spring Security都是Java安全框架,但Shiro更轻量级,使用简单,适用于小型和中型项目。而Spring Security功能更为强大,适用于大型企业级应用。

Q: 如何自定义Shiro的Realm?

A: 自定义Shiro的Realm需要继承AuthorizingRealm类,并实现doGetAuthorizationInfodoGetAuthenticationInfo方法,分别处理授权和认证逻辑。

小结

通过本文的详细介绍,我们深入探讨了Shiro的核心组件,以及如何在Spring Boot项目中集成和使用Shiro。从依赖导入、数据库表数据初始化,到自定义Realm和Shiro配置,我们全面覆盖了开发中常见的问题和解决方案。希望这些内容能够帮助您在实际开发中更好地使用Shiro,提升应用的安全性。😊

表格总结

功能模块

描述

示例代码

Shiro身份和权限认证

介绍Shiro的身份认证和权限认证原理

见上文

Shiro安装

安装Shiro并配置其依赖

见上文

数据库表数据初始化

创建用户、角色和权限的数据库表结构

见上文

自定义Realm

实现自定义的身份认证和授权逻辑

见上文

Shiro配置

配置Shiro的安全过滤规则

见上文

使用Shiro进行认证

在Controller中使用Shiro进行登录验证

见上文

总结

本文通过详细的示例和解释,深入探讨了如何在Spring Boot中集成和使用Shiro。从基本的依赖配置到实际的身份认证和授权,我们全面覆盖了开发中常见的问题和解决方案。希望这些内容能帮助您在实际开发中更好地使用Shiro

,提升应用的安全性。

未来展望

随着Web应用的复杂性和安全需求的增加,Shiro将在身份验证和授权管理中发挥越来越重要的作用。未来,我们将探讨更多高级功能,如会话管理、分布式认证以及Shiro与其他安全框架的集成。希望大家持续关注,深入学习,共同提升技术水平。

参考资料

通过本篇博客的学习,相信大家已经掌握了Spring Boot与Shiro集成的基本方法和实践。希望大家在实际项目中能够灵活运用这些知识,打造更加安全和稳定的应用。👍

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2024-11-19,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 🛡️ Spring Boot中集成Shiro:全面指南 🚀
    • 摘要
    • 引言
    • 正文内容
      • 1. Spring Boot中集成Shiro
      • 🤔 QA环节
      • 小结
      • 表格总结
      • 总结
      • 未来展望
      • 参考资料
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档