Spring Security:データベースがサポートするUserDetailsServiceによる認証
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ベースのプロジェクトであるため、そのままインポートして実行するのは簡単です。