Spring Security:データベース支援UserDetailsS​​erviceによる認証

Spring Security:データベースがサポートするUserDetailsS​​erviceによる認証

1. 概要

この記事では、Spring Securityで認証するためのカスタムデータベースバックアップUserDetailsServiceを作成する方法を示します。

2. UserDetailsService

UserDetailsServiceインターフェースは、ユーザー関連データを取得するために使用されます。 これには、ユーザーを見つけるプロセスをカスタマイズするためにオーバーライドできるloadUserByUsername()という名前のメソッドが1つあります。

これは、認証中にユーザーに関する詳細をロードするためにDaoAuthenticationProviderによって使用されます。

3. Userモデル

ユーザーを格納するために、次の属性を使用して、データベーステーブルにマップされる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. ユーザーの取得

ユーザー名に関連付けられたユーザーを取得するために、JpaRepositoryインターフェイスを拡張して、Spring Dataを使用してDAOクラスを作成します。

public interface UserRepository extends JpaRepository {

    User findByUsername(String username);
}

5. UserDetailsService

独自のユーザーサービスを提供するには、UserDetailsServiceインターフェイスを実装する必要があります。

インターフェイスのメソッドloadUserByUsername()をオーバーライドするMyUserDetailsServiceというクラスを作成します。

このメソッドでは、DAOを使用してUserオブジェクトを取得し、存在する場合は、UserDetailsを実装するMyUserPrincipalオブジェクトにラップして、次のように返します。

@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. スプリング構成

カスタムUserDetailsService実装を使用するために必要な、XMLとアノテーションベースの両方のタイプのSpring構成を示します。

6.1. 注釈の構成

カスタムUserDetailsService isを有効にするために必要なことは、それをBeanとしてアプリケーションコンテキストに追加することだけです。

@Serviceアノテーションを使用してクラスを構成したため、アプリケーションはコンポーネントスキャン中にクラスを自動的に検出し、このクラスからBeanを作成します。 したがって、ここで行う必要のあることは他にありません。

または、次のこともできます。

  • AuthenticationManagerBuilder#userDetailsServiceメソッドを使用してauthenticationManagerで構成します

  • カスタムauthenticationProvider Beanのプロパティとして設定し、AuthenticationManagerBuilder# authenticationProvider関数を使用してそれを挿入します

6.2. XML構成

一方、XML構成の場合、タイプMyUserDetailsServiceのBeanを定義し、それをSpringのauthentication-providerBeanに注入する必要があります。




    
        
        
    



    

7. その他のデータベースに基づく認証オプション

AuthenticationManagerBuilder は、アプリケーションでJDBCベースの認証を構成するためのもう1つの方法を提供します。

DataSourceインスタンスを使用してAuthenticationManagerBuilder.jdbcAuthenticationを構成する必要があります。 データベースがSpring User Schemaに従う場合、デフォルトの構成が適しています。

このアプローチを使用した基本的な構成をa previous postで確認しました。

この構成の結果であるJdbcUserDetailsManager entityは、UserDetailsService tooを実装します。

その結果、特にDataSourceを自動的に構成するSpring Bootを使用している場合は、この構成の実装が簡単であると結論付けることができます。

とにかく、アプリケーションがユーザーの詳細を取得する方法を正確にカスタマイズして、より高いレベルの柔軟性が必要な場合は、このチュートリアルで従ったアプローチを選択します。

8. 結論

要約すると、この記事では、永続データに裏打ちされたカスタムのSpringベースのUserDetailsServiceを作成する方法を示しました。

実装はthe GitHub projectにあります。これはMavenベースのプロジェクトであるため、そのままインポートして実行するのは簡単です。