Spring Security:データベース支援UserDetailsServiceによる認証
1概要
この記事では、Spring Securityで認証するためのカスタムのデータベースベースの
UserDetailsService
を作成する方法を説明します。
2
UserDetailsService
UserDetailsService
インターフェースは、ユーザー関連データを取得するために使用されます。ユーザー名に基づいてユーザーエンティティを検索する
loadUserByUsername()
という名前のメソッドが1つあり、ユーザーを検索するプロセスをカスタマイズするためにオーバーライドできます。
認証中にユーザーに関する詳細をロードするために
DaoAuthenticationProvider
によって使用されます。
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ユーザーの取得
ユーザー名に関連付けられたユーザーを取得するために、
JpaRepository
インターフェースを拡張することによって、
Spring Data
を使用して
DAO
クラスを作成します。
public interface UserRepository extends JpaRepository<User, Long> {
User findByUsername(String username);
}
** 5
UserDetailsService
**
独自のユーザーサービスを提供するために、
UserDetailsService
インターフェースを実装する必要があります。
インターフェイスのメソッド
loadUserByUsername()
をオーバーライドする
MyUserDetailsService
というクラスを作成します。
このメソッドでは、
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. スプリング構成
カスタム
UserDetailsService
実装を使用するために必要な、XMLとアノテーションベースの両方のタイプのSpring設定をデモンストレーションします。
6.1. アノテーション設定
Springアノテーションを使用して、
UserDetailsService
Beanを定義し、それを
authenticationProvider
Beanのプロパティとして設定します。これを
authenticationManager
に注入します。
@Autowired
private MyUserDetailsService userDetailsService;
@Override
protected void configure(AuthenticationManagerBuilder auth)
throws Exception {
auth.authenticationProvider(authenticationProvider());
}
@Bean
public DaoAuthenticationProvider authenticationProvider() {
DaoAuthenticationProvider authProvider
= new DaoAuthenticationProvider();
authProvider.setUserDetailsService(userDetailsService);
authProvider.setPasswordEncoder(encoder());
return authProvider;
}
@Bean
public PasswordEncoder encoder() {
return new BCryptPasswordEncoder(11);
}
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. 結論
この記事では、永続データを基にしたカスタムのSpringベースの
UserDetailsService
を作成する方法を説明しました。
実装はhttps://github.com/eugenp/tutorials/tree/master/spring-security-mvc-boot[GitHubプロジェクト]にあります – これはMavenベースのプロジェクトなので、インポートするのは簡単なはずです。そのまま実行します。