当前位置: 首页 > news >正文

SpringBoot整合SpringSecurity详解

文章目录

  • SpringBoot整合SpringSecurity详解
    • 一、引言
    • 二、引入依赖
    • 三、配置 Spring Security
    • 四、自定义用户详细信息服务
    • 五、使用示例
      • 1. 创建用户实体类
      • 2. 测试登录功能
    • 六、总结

SpringBoot整合SpringSecurity详解

在这里插入图片描述

一、引言

在当今的软件开发中,安全是一个至关重要的方面。Spring Security 是一个强大且可扩展的 Java 安全框架,用于保护基于 Spring 的应用程序。它提供了身份验证、授权和多种安全防护机制,如 CSRF 保护和防止会话劫持等。通过与 Spring Boot 的无缝集成,Spring Security 成为构建安全应用的理想选择。本文将详细介绍如何在 Spring Boot 应用程序中整合 Spring Security,包括配置、用户认证和授权等关键步骤。

二、引入依赖

在开始之前,我们需要在 Spring Boot 项目中引入 Spring Security 相关的依赖。在 pom.xml 文件中添加以下依赖:

xml复制

<!-- Spring Security Starter -->
<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-security</artifactId><version>3.3.4</version>
</dependency><!-- JWT 依赖,用于生成和解析 JSON Web Tokens -->
<dependency><groupId>io.jsonwebtoken</groupId><artifactId>jjwt-api</artifactId><version>0.12.6</version>
</dependency>
<dependency><groupId>io.jsonwebtoken</groupId><artifactId>jjwt-impl</artifactId><version>0.12.6</version><scope>runtime</scope>
</dependency>
<dependency><groupId>io.jsonwebtoken</groupId><artifactId>jjwt-jackson</artifactId><version>0.12.6</version><scope>runtime</scope>
</dependency>

三、配置 Spring Security

接下来,我们需要创建一个配置类 SecurityConfig,用于管理所有与 Spring Security 相关的配置。这个类需要使用 @EnableWebSecurity 注解来启用 Spring Security 的 web 安全功能。

java复制

@Configuration
@EnableWebSecurity
public class SecurityConfig extends WebSecurityConfigurerAdapter {@Autowiredprivate CustomUserDetailsService userDetailsService;@Overrideprotected void configure(HttpSecurity http) throws Exception {http.csrf().disable() // 关闭 CSRF 保护.authorizeRequests().antMatchers("/login", "/register").permitAll() // 允许匿名访问登录和注册页面.anyRequest().authenticated() // 其他所有请求都需要认证.and().formLogin().loginPage("/login").permitAll() // 自定义登录页面.defaultSuccessUrl("/home", true) // 登录成功后跳转到主页.and().logout().permitAll(); // 允许注销}@Autowiredpublic void configureGlobal(AuthenticationManagerBuilder auth) throws Exception {auth.userDetailsService(userDetailsService).passwordEncoder(passwordEncoder());}@Beanpublic PasswordEncoder passwordEncoder() {return new BCryptPasswordEncoder();}
}

在上述配置中,我们禁用了 CSRF 保护,允许匿名访问登录和注册页面,并且所有其他请求都需要认证。我们还自定义了登录页面和登录成功后的跳转页面。此外,我们配置了用户详细信息服务和密码编码器。

四、自定义用户详细信息服务

为了加载用户的详细信息,我们需要实现 UserDetailsService 接口。这个接口提供了一个方法 loadUserByUsername,用于根据用户名加载用户信息。

java复制

@Service
public class CustomUserDetailsService implements UserDetailsService {@Autowiredprivate UserRepository userRepository;@Overridepublic UserDetails loadUserByUsername(String username) throws UsernameNotFoundException {User user = userRepository.findByUsername(username);if (user == null) {throw new UsernameNotFoundException("User not found");}return new org.springframework.security.core.userdetails.User(user.getUsername(), user.getPassword(), true, true, true, true, user.getAuthorities());}
}

在这个实现中,我们从数据库中查找用户信息,并返回一个 UserDetails 对象。如果用户不存在,则抛出 UsernameNotFoundException 异常。

五、使用示例

1. 创建用户实体类

首先,我们需要创建用户、角色和权限的实体类。这些实体类将用于存储用户信息和权限信息。

java复制

package com.geli.domain;import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import java.io.Serializable;
import java.util.Date;
import java.util.Set;@NoArgsConstructor
@AllArgsConstructor
@Data
public class User implements Serializable {private Integer id;private String username;private String password;private String addUser;private String editUser;private Date addDate;private Date updateDate;private Role role;
}@NoArgsConstructor
@Data
public class Role implements Serializable {private Integer id;private String name;private String keyWord;private String description;private Set<Permission> permissionList;
}@Data
@NoArgsConstructor
public class Permission implements Serializable {private Integer id;private String name;private String keyWord;private String description;
}

2. 测试登录功能

为了测试登录功能,我们可以在 UserServiceImpl 中添加一个用户账号,并尝试登录。

java复制

import com.geli.service.UserService;
import org.springframework.stereotype.Service;@Service
public class UserServiceImpl implements UserService {@Overridepublic User findUserByUserName(String username) {User user = new User();user.setId(1);user.setUsername("D46033");user.setPassword("$2a$10$Pgs46f8LzTjOvA5Sg6qDkOBbUoAtWQQdHFoEbbmWPak.34/NwJQrW");return user;}
}

登录成功后,用户将被重定向到自定义的主页。

六、总结

本文详细介绍了如何在 Spring Boot 应用程序中整合 Spring Security,包括引入依赖、配置安全策略、自定义用户详细信息服务和测试登录功能。通过这些步骤,您可以为您的应用程序提供强大的安全保护。希望本文对您有所帮助,如果您有任何问题或建议,请随时留言。


版权声明:本博客内容为原创,转载请保留原文链接及作者信息。

参考文章

  • spring security 超详细使用教程(接入springboot、前后端分离)
  • SpringBoot整合SpringSecurity详细教程(实战开发讲解)
http://www.lryc.cn/news/522118.html

相关文章:

  • 【C++基础】enum,union,uint8_t,static
  • 单片机的原理及其应用:从入门到进阶的全方位指南
  • 如何使用 Go语言操作亚马逊 S3 对象云存储
  • 2025年应用与API安全展望:挑战与机遇并存
  • Linux安装docker,安装配置xrdp远程桌面
  • VD:生成a2l文件
  • 【SpringBoot应用篇】SpringBoot+MDC+自定义Filter操作traceId实现日志链路追踪
  • unity2022以上导出到AndroidStudio后更新步骤
  • 【ArcGIS初学】产生随机点计算混淆矩阵
  • Harmony面试模版
  • PCM5142集成32位384kHz PCM音频立体声114dB差分输出DAC编解码芯片
  • 浪潮云财务系统xtdysrv.asmx存在命令执行漏洞
  • 【网络编程】基础知识
  • ResNet (Residual Network) - 残差网络:深度卷积神经网络的突破
  • MOSFET体二极管的反向恢复分析
  • 80_Redis内存策略
  • 【HarmonyOS NAPI 深度探索6】使用 N-API 创建第一个 Hello World 原生模块
  • Java语言的软件工程
  • 【Mysql进阶知识】Mysql 程序的介绍、选项在命令行配置文件的使用、选项在配置文件中的语法
  • wireshark抓路由器上的包 抓包路由器数据
  • 玩转大语言模型——使用graphRAG+Ollama构建知识图谱
  • python flask简单实践
  • JAVA实现五子棋小游戏(附源码)
  • kotlin的dagger hilt依赖注入
  • 速通Docker === 常用命令
  • 【redis】键的全局命令
  • 深度学习-卷积神经网络实战文档注释
  • GR2103高压半桥栅极驱动芯片
  • 学习threejs,使用OrbitControls相机控制器
  • 说说Babylon.js中scene.deltaTime的大坑