Spring Boot 中的 Authentication(身份验证) 怎么配置?一文讲解 Spring Boot 中的 Authentication

Authentication(身份验证)是指确认用户的身份,以确保他们是否有权限访问系统资源。在 Spring Boot 中,Authentication 的主要目的是验证用户的身份并授权他们的请求。

用 Apifox,节省研发团队的每一分钟

Spring Boot 中的 Authentication(身份验证) 怎么配置?一文讲解 Spring Boot 中的 Authentication

免费使用 Apifox

相关推荐

最新文章

Authentication(身份验证)是指确认用户的身份,以确保他们是否有权限访问系统资源。在 Spring Boot 中,Authentication 的主要目的是验证用户的身份并授权他们的请求。它为项目提供了以下优势:

  • 安全性:通过身份验证,你可以确保只有合法用户可以访问你的应用程序,从而提高了应用程序的安全性。
  • 访问控制:你可以根据用户的身份和权限来控制他们对应用程序资源的访问,从而实现精确的访问控制。
  • 用户体验:提供了用户友好的登录和认证流程,改善了用户体验。

Authentication(身份验证) 使用场景

身份验证在几乎所有的 Web 应用程序中都是必要的,尤其是需要用户登录或需要访问敏感信息的应用程序。以下是一些常见的使用场景:

  • 用户登录:允许用户使用用户名和密码登录到应用程序。
  • 社交登录:允许用户使用社交媒体帐户(如 Google、Facebook)登录。
  • 单点登录(SSO):允许用户在多个相关应用程序之间使用一次登录凭据。
  • API 身份验证:保护 API 端点,以确保只有经过身份验证的用户可以访问它们。
  • 多租户应用程序:在多租户环境中,确保租户间的数据和操作是隔离的。

Authentication(身份验证) 配置

要在 Spring Boot 项目中配置 Authentication,你可以遵循以下步骤:

1.添加 Spring Security 依赖:在pom.xml文件中添加 Spring Security 依赖,这将为你提供身份验证和授权的基本功能。

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


2.配置 Security 设置:根据你的需求,在application.propertiesapplication.yml中配置 Spring Security 的设置,例如定义登录页、退出页、角色等。

spring.security.user.name=user
spring.security.user.password=password


3.创建自定义用户服务(可选):如果你的应用程序需要自定义的用户存储,你可以创建一个自定义的用户服务实现UserDetailsService接口,并配置 Spring Security 来使用它。


4.设置访问控制规则:使用@PreAuthorize@Secured或配置HttpSecurity来定义访问控制规则,以确保只有授权的用户可以访问特定资源。

Authentication(身份验证)  实践案例

当涉及到 Spring Boot 中的 Authentication(身份验证),下面将创建一个简单的 Web 应用程序,展示如何配置基本的用户名和密码身份验证。在这个案例中,我们将使用内存中的用户存储来管理用户。请按照以下步骤逐步进行配置和解释。

步骤 1:创建 Spring Boot 项目

首先,创建一个新的 Spring Boot 项目。你可以使用 Spring Initializer(https://start.spring.io/)或你喜欢的 IDE 来创建项目,确保选择 Spring Security 作为依赖项。关于具体的创建,你可以访问这篇文章:【如何在线建一个 JAVA 的 Spring Boot 项目?Spring Boot 快速入门 Helloworld 示例】

步骤 2:创建一个简单的控制器

创建一个简单的控制器来定义应用程序的几个端点。我们将创建一个首页和一个受保护的页面。

@RestController
public class HomeController {

    @GetMapping("/")
    public String home() {
        return "Welcome to the secured area!";
    }

    @GetMapping("/admin")
    public String admin() {
        return "Admin dashboard - Only accessible to admin users.";
    }
}

步骤 3:配置 Spring Security

创建一个配置类,继承自WebSecurityConfigurerAdapter,并覆盖configure方法来配置 Spring Security。

@Configuration
@EnableWebSecurity
public class SecurityConfig extends WebSecurityConfigurerAdapter {

    @Override
    protected void configure(HttpSecurity http) throws Exception {
        http
            .authorizeRequests()
                .antMatchers("/").permitAll() // 首页允许所有人访问
                .antMatchers("/admin").hasRole("ADMIN") // /admin 需要 ADMIN 角色
                .anyRequest().authenticated() // 所有其他请求需要认证
                .and()
            .formLogin()
                .loginPage("/login") // 指定登录页面
                .permitAll()
                .and()
            .logout()
                .permitAll();
    }

    @Autowired
    public void configureGlobal(AuthenticationManagerBuilder auth) throws Exception {
        auth
            .inMemoryAuthentication()
                .withUser("user").password("{noop}password").roles("USER")
                .and()
                .withUser("admin").password("{noop}adminpassword").roles("ADMIN");
    }
}

现在,让我们详细解释上述配置:

  • configure方法:这是用于配置 Spring Security 的核心方法。我们定义了以下规则:
  • / 路径是对所有用户开放的,任何人都可以访问首页。
  • /admin 路径要求用户具有 ADMIN 角色才能访问。
  • 所有其他请求都需要进行身份验证。
  • 我们启用了基于表单的登录,使用了默认的 /login 端点,并允许所有用户访问它。
  • 我们也启用了注销功能,允许所有用户注销。
  • configureGlobal方法:这里我们配置了内存中的用户存储,包括一个普通用户和一个管理员用户。{noop} 前缀表示密码以明文形式存储,这是为了简化示例,实际应用中应该使用密码哈希。

步骤 4:创建登录页面

创建一个名为 login.html 的 HTML 文件,用于自定义登录页面。你可以将它放在src/main/resources/templates目录下。

<!DOCTYPE html>
<html>
<head>
    <title>Login Page</title>
</head>
<body>
    <h2>Login Page</h2>
    <form th:action="@{/login}" method="post">
        <label for="username">Username: </label>
        <input type="text" id="username" name="username" required><br><br>
        <label for="password">Password: </label>
        <input type="password" id="password" name="password" required><br><br>
        <button type="submit">Login</button>
    </form>
</body>
</html>

步骤 5:运行应用程序

现在,你可以运行你的 Spring Boot 应用程序。访问http://localhost:8080/ 将显示欢迎页面,但尝试访问http://localhost:8080/admin 将需要登录。
当你尝试访问受保护的页面时,你将被重定向到自定义的登录页面。使用在configureGlobal方法中配置的用户名和密码登录。

Spring Boot 中的 Authentication鉴权登录界面
Spring Boot 中的 Authentication鉴权登录界面
Spring Boot 中的 Authentication鉴权登录成功消息
Spring Boot 中的 Authentication鉴权登录成功消息

使用 Apifox 测试和管理接口

如果你是 JAVA 开发者,你经常需要与 API 打交道,确保你的应用程序能够正常工作。这时,一个强大的接口测试工具就会派上用场。

Apifox 是一个比 Postman 更强大的接口测试工具,Apifox = Postman + Swagger + Mock + JMeter,Apifox 支持调试 http(s)、WebSocket、Socket、gRPC、Dubbo 等协议的接口,并且集成了 IDEA 插件。在开发完接口后,可以通过 Apifox 的 IDEA 插件一键自动生成接口文档,多端同步,非常方便测试和维护。

Apifox 的 IDEA 插件
Apifox 的 IDEA 插件
Apifox 接口调试界面
Apifox 接口调试界面

注意事项

在配置 Spring Boot 的 Authentication 时,要注意以下事项:

  • 密码安全性:始终使用安全的密码存储和传输方式。避免明文存储密码,并使用密码哈希和加盐来增加安全性。
  • 授权:不仅要验证用户身份,还要确保用户有权执行他们请求的操作。使用角色和权限进行细粒度的授权。
  • 漏洞和更新:Spring Boot 和 Spring Security 是活跃的项目,定期更新以修复漏洞和提供新功能。确保及时更新依赖项。

知识扩展:


参考链接:

深入学习 Spring Boot Authentication,请参考官方文档和相关教程:

  • Spring Security 官方文档:https://docs.spring.io/spring-security/reference/