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


    使用 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.bootgroupId>
        <artifactId>spring-boot-starter-securityartifactId>
    dependency>
    
    • 1
    • 2
    • 3
    • 4

    这将包括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();
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34

    在上述代码中,我们创建了一个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;
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25

    在上述代码中,我们创建了一个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;
        // 省略其他字段和方法
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12

    在上述代码中,我们使用@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);
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5

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

    创建登录页面

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

    DOCTYPE html>
    <html>
    <head>
        <meta charset="UTF-8">
        <title>Login Pagetitle>
    head>
    <body>
        <h1>Loginh1>
        <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">Loginbutton>
            div>
        form>
    body>
    html>
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23

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

    创建安全控制器

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

    、注销和访问拒绝的情况。在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";
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16

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

    运行应用程序

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

    mvn spring-boot:run
    
    • 1

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

    测试应用程序

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

    总结

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

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

  • 相关阅读:
    2022互联网企业Java岗面试总纲:JVM+分布式+Spring+算法数据结构
    ChatGPT调教指南 | 咒语指南 | Prompts提示词教程(二)
    Linux: 命令:echo
    【ASE入门学习】ASE入门系列二十——flowmap
    Python实现单例模式
    压电换能器的工作原理和应用(功率放大器)
    自学的一些面试题-html
    海上船舶交通事故VR模拟体验低成本高效率-深圳华锐视点
    AdvancedCombine/高级组合,Futures/转义闭包转换为未来发布者 的详细使用
    【OpenCV + Qt】 图像处理操作
  • 原文地址:https://blog.csdn.net/yujun2023/article/details/133244027