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ベースのプロジェクトなので、インポートするのは簡単なはずです。そのまま実行します。