📜  如何在 Spring Boot 中实现简单的身份验证?(1)

📅  最后修改于: 2023-12-03 14:52:34.552000             🧑  作者: Mango

如何在 Spring Boot 中实现简单的身份验证?

在 Web 应用程序开发中,身份验证是一项必不可少的功能。Spring Boot 提供了多种方式来实现身份验证,包括基于表单的验证和基于 HTTP 基本认证的验证等等。在本文中,我们将介绍如何在 Spring Boot 中实现简单的基于表单的身份验证。

步骤一:添加 Spring Security 依赖

首先,我们需要在我们的项目中添加 Spring Security 依赖。在 pom.xml 文件中添加以下依赖:

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-security</artifactId>
</dependency>
步骤二:创建用户认证类

我们需要创建一个类来实现用户认证。在这个例子中,我们假设我们已经有了一个用户数据库表,并有一个 User 类来表示用户。我们将创建一个 CustomUserDetailsService 类来实现用户的认证。

@Service
public class CustomUserDetailsService implements UserDetailsService {

    @Autowired
    private UserRepository userRepository;

    @Override
    public UserDetails loadUserByUsername(String username) throws UsernameNotFoundException {
        User user = userRepository.findByUsername(username);

        if (user == null) {
            throw new UsernameNotFoundException("User not found with username: " + username);
        }

        return new org.springframework.security.core.userdetails.User(user.getUsername(), user.getPassword(),
                new ArrayList<>());
    }

}

在上面的代码中,我们通过 UserDetailsService 接口来实现用户的认证逻辑。在 loadUserByUsername 方法中,我们可以从数据库中获取用户的密码信息并返回一个 UserDetails 对象。

步骤三:配置 Spring Security

现在,我们需要配置 Spring Security,使其支持表单身份验证。在我们的 Spring Boot 应用程序的配置类中添加以下内容:

@Configuration
@EnableWebSecurity
public class SecurityConfiguration extends WebSecurityConfigurerAdapter {

    @Autowired
    private CustomUserDetailsService customUserDetailsService;

    @Override
    protected void configure(AuthenticationManagerBuilder auth) throws Exception {
        auth.userDetailsService(customUserDetailsService).passwordEncoder(passwordEncoder());
    }

    @Override
    protected void configure(HttpSecurity http) throws Exception {
        http.authorizeRequests().antMatchers("/").permitAll().antMatchers("/login").permitAll().anyRequest()
                .authenticated().and().csrf().disable().formLogin().loginPage("/login").failureUrl("/login?error=true")
                .defaultSuccessUrl("/home").usernameParameter("username").passwordParameter("password").and().logout()
                .logoutRequestMatcher(new AntPathRequestMatcher("/logout")).logoutSuccessUrl("/login").and()
                .exceptionHandling().accessDeniedPage("/access-denied");
    }

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

}

在上面的代码中,我们使用了 @EnableWebSecurity 注解来启用 Spring Security。在 configure 方法中,我们配置了自定义的 CustomUserDetailsService 和密码编码器。在 configure(HttpSecurity http) 方法中,我们配置了表单登录页面、登出以及访问拒绝页面等等。

步骤四:添加表单登录页面

最后,我们需要添加一个表单登录页面。在我们的应用程序中,我们可以创建一个名为 login.html 的文件,并添加以下内容:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Login Page</title>
</head>
<body>

<div th:if="${param.error}">
    Invalid username or password.
</div>

<form th:action="@{/login}" method="post">
    <div>
        <label>Username:</label>
        <input type="text" name="username" required="required"/>
    </div>
    <div>
        <label>Password:</label>
        <input type="password" name="password" required="required"/>
    </div>
    <input type="submit" value="Login"/>
</form>

</body>
</html>

在上面的代码中,我们创建了一个表单,并使用 Thymeleaf 模板语言来渲染页面。

总结

在本文中,我们介绍了如何在 Spring Boot 中实现基于表单的身份验证。实现只需要几个简单的步骤,即添加 Spring Security 依赖、创建用户认证类、配置 Spring Security 和添加表单登录页面。如果您需要更高级的身份验证功能,例如 OAuth2 认证,那么 Spring Security 也提供了相应的支持。