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