Spring Security:基於數據庫的用户詳細信息服務認證

Spring Security
Remote
1
10:40 PM · Nov 29 ,2025

1. 概述

在本文中,我們將演示如何為 Spring Security 使用創建自定義數據庫支持的 UserDetailsService 進行身份驗證的方法。

2. The 接口用於檢索用户相關數據。它有一個名為 的方法,可以覆蓋以自定義查找用户的過程。

它被 用於在身份驗證過程中加載用户詳細信息。

3. 用户模型

為了存儲用户,我們將創建一個 User 實體,該實體映射到數據庫表,具有以下屬性:

@Entity
public class User {

    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    private Long id;

    @Column(nullable = false, unique = true)
    private String username;

    private String password;

    // standard getters and setters
}

4. 檢索用户

為了檢索與用户名關聯的用户,我們將使用 DAO 類並使用 Spring Data 通過擴展 JpaRepository 接口:

public interface UserRepository extends JpaRepository<User, Long> {

    User findByUsername(String username);
}

5. 用户服務詳情 UserDetailsService

為了提供我們自己的用户服務,我們需要實現 UserDetailsService 接口。

我們將創建一個名為 MyUserDetailsService 的類,該類將覆蓋接口中的 loadUserByUsername() 方法。

在該方法中,我們使用 DAO 獲取 User 對象,如果存在,則將其包裝成 MyUserPrincipal 對象,該對象實現了 UserDetails 接口,並返回它:

@Service
public class MyUserDetailsService implements UserDetailsService {

    @Autowired
    private UserRepository userRepository;

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

讓我們定義 MyUserPrincipal 類如下:

public class MyUserPrincipal implements UserDetails {
    private User user;

    public MyUserPrincipal(User user) {
        this.user = user;
    }
    //...
}

6. Spring 配置文件我們將演示兩種類型的 Spring 配置文件:XML 和基於註解的配置,這些配置對於使用我們的自定義 UserDetailsService 實現是必不可少的。

6.1. 基於註解的配置我們需要做的僅僅是將其添加到我們的應用程序上下文中作為 Bean。

由於我們使用 @Service 註解配置了我們的類,應用程序將在組件掃描期間自動檢測它,並將其作為 Bean 創建出來。因此,這裏我們不需要做任何其他操作。

或者,我們可以:

  • authenticationManager 中使用 AuthenticationManagerBuilder#userDetailsService 方法進行配置
  • 將其設置為自定義 authenticationProvider Bean 的屬性,然後使用 AuthenticationManagerBuilder# authenticationProvider 函數注入它
  • 6.2. XML 配置文件另一方面,對於 XML 配置,我們需要定義一個類型為 MyUserDetailsService 的 Bean,並將其注入 Spring 的 authentication-provider Bean 中:

    <bean id="myUserDetailsService" 
      class="org.baeldung.security.MyUserDetailsService"/>
    
    <security:authentication-manager>
        <security:authentication-provider 
          user-service-ref="myUserDetailsService" >
            <security:password-encoder ref="passwordEncoder">
            </security:password-encoder>
        </security:authentication-provider>
    </security:authentication-manager>
        
    <bean id="passwordEncoder" 
      class="org.springframework.security
      .crypto.bcrypt.BCryptPasswordEncoder">
        <constructor-arg value="11"/>
    </bean>

    7. 其他基於數據庫的身份驗證選項The AuthenticationManagerBuilder 提供了一種其他的方法來配置我們的應用程序中基於 JDBC 的身份驗證。

    我們需要使用AuthenticationManagerBuilder.jdbcAuthentication配置一個DataSource實例。如果我們的數據庫遵循Spring User Schema,則默認配置將適合我們。

    我們在之前的帖子中看到過使用這種方法的基本配置。

    由這種配置產生的JdbcUserDetailsManager實體也實現了UserDetailsService

    因此,我們可以得出結論,這種配置更容易實現,尤其當我們使用 Spring Boot 時,它會自動為我們配置DataSource

    如果我們需要,則可以自定義應用程序如何檢索用户詳細信息,以獲得更高的靈活性,我們將會採用在本教程中使用的方法。

    8. 結論

    綜上所述,本文介紹瞭如何創建基於 Spring 的 UserDetailsService,並支持持久化數據。

    user avatar
    0 位用戶收藏了這個故事!
    收藏

    發佈 評論

    Some HTML is okay.