使用 Spring Security 实现安全认证的 Spring Boot 应用

news2024/11/25 2:43:33

使用 Spring Security 实现安全认证的 Spring Boot 应用

在开发Web应用程序时,保护用户的数据和应用程序是至关重要的。Spring Security是Spring生态系统的一部分,它提供了一种强大的方法来实现身份验证和授权。本文将详细介绍如何使用Spring Security来保护您的Spring Boot应用程序,并提供示例代码。

在这里插入图片描述

Spring Security简介

Spring Security是Spring生态系统中用于处理安全性的框架。它提供了身份验证、授权、会话管理和攻击防护等功能,使得您可以轻松地保护Web应用程序。Spring Security具有高度可定制性,可以满足各种应用程序的安全性需求。

创建Spring Boot项目

首先,确保您已经安装了Java开发环境和Maven。接下来,您可以使用Spring Initializer创建一个新的Spring Boot项目。在https://start.spring.io/上选择您的项目配置,然后生成项目并下载。

添加Spring Security依赖

在生成的项目中,您需要添加Spring Security的依赖。在pom.xml文件中,确保以下依赖项已经添加:

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-security</artifactId>
</dependency>

这将包括Spring Security所需的所有依赖。

创建Spring Security配置

接下来,您需要创建一个Spring Security配置类,以定义安全性规则。在src/main/java/com/example/demo包中创建一个名为SecurityConfig的类:

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.security.config.annotation.web.builders.HttpSecurity;
import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity;
import org.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter;
import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder;
import org.springframework.security.crypto.password.PasswordEncoder;

@Configuration
@EnableWebSecurity
public class SecurityConfig extends WebSecurityConfigurerAdapter {

    @Override
    protected void configure(HttpSecurity http) throws Exception {
        http
            .authorizeRequests()
                .antMatchers("/public/**").permitAll()
                .antMatchers("/private/**").authenticated()
            .and()
            .formLogin()
                .loginPage("/login")
            .and()
            .logout()
                .logoutSuccessUrl("/login?logout")
            .and()
            .exceptionHandling()
                .accessDeniedPage("/403");
    }

    @Bean
    public PasswordEncoder passwordEncoder() {
        return new BCryptPasswordEncoder();
    }
}

在上述代码中,我们创建了一个SecurityConfig类,并使用@Configuration@EnableWebSecurity注解来标识它是一个Spring Security配置类。我们还继承了WebSecurityConfigurerAdapter类,以便自定义安全性规则。

configure方法中,我们定义了访问规则,允许所有用户访问/public/**路径,但需要身份验证才能访问/private/**路径。我们还配置了登录和注销的行为,以及异常处理。

创建用户服务

接下来,我们需要创建一个用户服务来管理用户信息。在src/main/java/com/example/demo包中创建一个名为UserDetailsServiceImpl的类:

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.security.core.userdetails.UserDetails;
import org.springframework.security.core.userdetails.UserDetailsService;
import org.springframework.security.core.userdetails.UsernameNotFoundException;
import org.springframework.stereotype.Service;

@Service
public class UserDetailsServiceImpl implements UserDetailsService {

    private final UserRepository userRepository;

    @Autowired
    public UserDetailsServiceImpl(UserRepository userRepository) {
        this.userRepository = userRepository;
    }

    @Override
    public UserDetails loadUserByUsername(String username) throws UsernameNotFoundException {
        User user = userRepository.findByUsername(username);
        if (user == null) {
            throw new UsernameNotFoundException("User not found");
        }
        return user;
    }
}

在上述代码中,我们创建了一个UserDetailsServiceImpl类,并实现了UserDetailsService接口。我们使用UserRepository来检索用户信息,如果找不到用户,将抛出UsernameNotFoundException异常。

创建用户实体

我们还需要创建一个用户实体类,该实体类将与数据库中的用户表对应。在src/main/java/com/example/demo包中创建一个名为User的类:

import javax.persistence.Entity;
import javax.persistence.Id;

@Entity
public class User implements UserDetails {

    @Id
    private Long id;
    private String username;
    private String password;
    // 省略其他字段和方法
}

在上述代码中,我们使用@Entity注解来标记这是一个JPA实体类,并实现了UserDetails接口,这使得User类可以在Spring Security中使用。

创建用户仓库

为了将用户信息存储到数据库中,我们需要创建一个用户仓库。在src/main/java/com/example/demo包中创建一个名为UserRepository的接口:

import org.springframework.data.jpa.repository.JpaRepository;

public interface UserRepository extends JpaRepository<User, Long> {
    User findByUsername(String username);
}

UserRepository接口继承自JpaRepository,它提供了基本的CRUD操作,而findByUsername方法用于按用户名查找用户。

创建登录页面

为了让用户进行身份验证,我们需要创建一个登录页面。在src/main/resources/templates目录中,创建一个名为login.html的HTML文件:

<!DOCTYPE html>
<html>
<head>
    <meta charset="UTF-8">
    <title>Login Page</title>
</head>
<body>
    <h1>Login</h1>
    <form action="/login" method="post">
        <div>
            <label for="username">Username:</label>
            <input type="text" id="username" name="username" required>
        </div>
        <div>
            <label for="password">Password:</label>
            <input type="password" id="password" name="password" required>
        </div>
        <div>
            <button type="submit">Login</button>
        </div>
    </form>
</body>
</html>

这是一个简单的登录页面,用户需要输入用户名和密码来进行身份验证。

创建安全控制器

最后,我们需要创建一个安全控制器来处理登录

、注销和访问拒绝的情况。在src/main/java/com/example/demo包中创建一个名为SecurityController的类:

import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.GetMapping;

@Controller
public class SecurityController {

    @GetMapping("/login")
    public String login() {
        return "login";
    }

    @GetMapping("/403")
    public String accessDenied() {
        return "403";
    }
}

SecurityController类包含了处理登录和访问拒绝的方法。

运行应用程序

现在,您可以运行应用程序了。使用Maven命令:

mvn spring-boot:run

您的Spring Boot应用程序将启动并运行在默认端口(通常是8080)上。

测试应用程序

使用浏览器访问http://localhost:8080/login来查看登录页面。您可以使用在数据库中创建的用户信息进行登录。

总结

本文详细介绍了如何使用Spring Security来保护Spring Boot应用程序,并提供了示例代码。Spring Security是一个功能强大的安全性框架,可以帮助您实现身份验证、授权和其他安全性功能,以保护您的应用程序和用户的数据。

以上是使用Spring Security实现安全认证的示例。希望这篇文章对您有所帮助,让您更好地了解如何在Spring Boot应用程序中实现安全认证。 Happy coding!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1036792.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

树莓派登录后运行PYTHON

网上记录的登录方式 通过服务 通过rd.local 通过 通过服务启动&#xff0c;可能会导致PYTHON代码部份未运行&#xff08;加SLEEP后可能也不行&#xff09; 注意完整路径 启动前先测试一下&#xff0c;否则可能启动后无效果 开机自启动脚本方法之一&#xff08;.Desktop文件…

uniapp iOS离线打包——原生工程配置

uniapp iOS离线打包&#xff0c;如何配置项目工程&#xff1f; 文章目录 uniapp iOS离线打包&#xff0c;如何配置项目工程&#xff1f;工程配置效果图DebugRelease 配置工程配置 Appkey应用图标模块及三方SDK配置未配置模块错误配置模块TIP: App iOS 离线打包 前提&#xff1a…

Javascript小案例-进度条(配置对象版)

gif演示图&#xff1a; 代码&#xff1a; 进度条(配置对象版).html <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"&…

一个关于IntroductionAdvisor的bug

一个关于IntroductionAdvisor的bug public class TestMain {public static void main(String[] args) {// 1. 准备被代理的目标对象People peo new People();// 2. 准备代理工厂ProxyFactory pf new ProxyFactory();// 3. 准备introduction advice,advice 持有需要额外添加的…

ps[001] 初学创建剪切蒙版

前置条件&#xff1a;PS2020版本 技能应用&#xff1a;ps 海报标题和图片结合 1、画布1300*1300像素&#xff0c;altdel设置背景为前景色 2、准备一张绿色的海报&#xff0c;可以百度宫崎骏&#xff0c;找张绿色的图片就可以了 3、拉个文字款&#xff0c;写个SUMMER英文体&a…

java面试题-集合类基础

导学 这次课程主要涉及到的是List和Map相关的面试题&#xff0c;比较高频就是 ArrayList LinkedList HashMap ConcurrentHashMap ArrayList底层实现是数组LinkedList底层实现是双向链表HashMap的底层实现使用了众多数据结构&#xff0c;包含了数组、链表、散列表、红黑树等…

机器学习笔记 - k-NN算法的数学表达

一、概述 所有的机器学习算法都是有假设前提的。k-NN算法的假设前提是相似的输入有相似的输出。其分类规则是对于测试输入x,在其k个最相似的训练输入中分配最常见的标签。 k-NN 的正式定义: 对于一个待测试数据。 将的个最近邻的集合表示为 。的正式定义为 ,并且。(意思就是…

Glitch free 无毛刺时钟切换电路,时钟无缝切换,时钟无毛刺切换技术

、无毛刺时钟切换电路&#xff0c;又叫 Glitch free 电路、时钟无缝切换电路&#xff0c;在笔试中遇到过&#xff0c;如果没有接触过&#xff0c;很可能无从下手。 随着越来越多的多时钟应用于当今的芯片中&#xff08;尤其是在通信领域&#xff09;&#xff0c;在芯片运行时经…

shap-An introduction to explainable AI with Shapley values

An introduction to explainable AI with Shapley values 训练模型检查模型系数使用部分依赖图的更完整的图片从部分相关性图中读取SHAP值Shapley值的可加性解释additive regression模型解释non-additive boosted tree模型解释线性逻辑回归模型解释non-additive boosted tree逻…

Jenkins “Trigger/call builds on other project“用法及携带参数

1.功能 “Trigger/call builds on other project” 功能是 Jenkins 中的一个特性&#xff0c;允许您在某个项目的构建过程中触发或调用另一个项目的构建。 当您在 Jenkins 中启用了 “Trigger/call builds on other project” 功能并配置了相应的触发条件后&#xff0c;当主项…

python实验2

1、实验题目&#xff1a;个人用户信息注册 模拟用户个人信息注册&#xff0c;需要输入用户个人信息 姓名、性别、年龄、血型、身高、电话 信息&#xff0c;并输出显示。 源代码&#xff1a; print(用户个人信息注册) name input("请输入您的姓名&#xff1a;") sex…

Northstar 量化平台

基于 B/S 架构、可替代付费商业软件的一站式量化交易平台。具备历史回放、策略研发、模拟交易、实盘交易等功能。兼顾全自动与半自动的使用场景。 已对接国内期货股票、外盘美股港股。 面向程序员的量化交易软件&#xff0c;用于期货、股票、外汇、炒币等多种交易场景&#xff…

1.2 kV SiC SWITCH-MOS 在短路应力后的分析

标题&#xff1a;Analysis of 1.2 kV SiC SWITCH-MOS after Short-circuit Stress 摘要 本研究调查了在短路应力后1.2 kV SWITCH-MOS的残余损伤。在应力施加后&#xff0c;相当于SWITCH-MOS耐受时间的约80%&#xff0c;正向阻断状态下的漏电流急剧增加。发现SWITCH-MOS中的SB…

一起学数据结构(8)——二叉树中堆的代码实现

在上篇文章中提到&#xff0c;提到了二叉树中一种特殊的结构——完全二叉树。对于完全二叉树&#xff0c;在存储时&#xff0c;适合使用顺序存储。对于非完全二叉树&#xff0c;适合用链式存储。本文将给出完全二叉树的顺序结构以及相关的代码实现&#xff1a; 1. 二叉树的结构…

Categraf v0.3.22部署

wget https://github.com/flashcatcloud/categraf/releases/download/v0.3.22/categraf-v0.3.22-linux-amd64.tar.gz下载安装包。 sudo mkdir /opt/categraf创建一个目录。 tar zxf categraf-v0.3.22-linux-amd64.tar.gz -C /opt/categraf进行解压。 /opt/categraf/categ…

ORA-27102: out of memory

正在外面办事呢&#xff0c;项目经理打电话并截图说明&#xff0c;物理服务器增加内存后&#xff0c;他调整sgapga后&#xff0c;重启无法启动了&#xff0c;报错ORA-27102: out of memory。 SYSorcl> startup; ORA-27102: out of memory Linux-x86_64 Error: 28: No space…

9领域事件

本系列包含以下文章&#xff1a; DDD入门DDD概念大白话战略设计代码工程结构请求处理流程聚合根与资源库实体与值对象应用服务与领域服务领域事件&#xff08;本文&#xff09;CQRS 案例项目介绍 # 既然DDD是“领域”驱动&#xff0c;那么我们便不能抛开业务而只讲技术&…

深度学习综述:Computation-efficient Deep Learning for Computer Vision: A Survey

论文作者&#xff1a;Yulin Wang,Yizeng Han,Chaofei Wang,Shiji Song,Qi Tian,Gao Huang 作者单位&#xff1a;Tsinghua University; Huawei Inc. 论文链接&#xff1a;http://arxiv.org/abs/2308.13998v1 内容简介&#xff1a; 在过去的十年中&#xff0c;深度学习模型取…

原生HTML实现marquee向上滚动效果

实现原理&#xff1a;借助CSS3中animation动画以及原生JS克隆API <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8" /><meta name"viewport" content"widthdevice-width, initial-scale1.0" /…

【MySQL集群二】使用MyCat和ProxySql代理MySQL集群

中间件代理MySQL MyCat安装MyCat介绍&#xff1a;步骤1&#xff1a;安装Java环境步骤2&#xff1a;下载并解压Mycat步骤3&#xff1a;配置Mycat步骤4&#xff1a;启动Mycat ProxySql安装ProxySql介绍&#xff1a;步骤1&#xff1a;更新系统步骤2&#xff1a;安装ProxySQL步骤3&…