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

1概要

この記事では、Spring Securityで認証するためのカスタムのデータベースベースの UserDetailsS​​ervice を作成する方法を説明します。

2 UserDetailsS​​ervice

UserDetailsS​​ervice インターフェースは、ユーザー関連データを取得するために使用されます。ユーザー名に基づいてユーザーエンティティを検索する 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 UserDetailsS​​ervice

**

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

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

このメソッドでは、 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. スプリング構成

カスタム UserDetailsS​​ervice 実装を使用するために必要な、XMLとアノテーションベースの両方のタイプのSpring設定をデモンストレーションします。

6.1. アノテーション設定

Springアノテーションを使用して、 UserDetailsS​​ervice 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設定では、 MyUserDetailsS​​ervice 型の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ベースの UserDetailsS​​ervice を作成する方法を説明しました。

実装はhttps://github.com/eugenp/tutorials/tree/master/spring-security-mvc-boot[GitHubプロジェクト]にあります - これはMavenベースのプロジェクトなので、インポートするのは簡単なはずです。そのまま実行します。