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

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

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

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

免费使用 Apifox

相关推荐

最新文章

API

一体化协作平台

API 设计

API 文档

API 调试

自动化测试

API Mock

API Hub

立即体验 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/