Spring Boot/認証/Spring Security/認証情報用取得用Service

Spring Boot/認証/Spring Security/認証情報用取得用Service

認証情報取得用 Service を実装する。

このように実装する。

@Service
public class UserDetailsServiceImpl implements UserDetailsService {
 
    @Override
    public UserDetails loadUserByUsername(String username) throws UsernameNotFoundException {
        MyUser user = null;
        try {
            user = new MyUser();
        } catch (Exception e) {
            throw new UsernameNotFoundException("no my user");
        }
 
        if(user == null){
            throw new UsernameNotFoundException("no my user");
        }
        return user;
    }
}

UserDetailsService を実装して、実装しないといけないメソッドは loadUserByUsername 1つである。

この username には画面から入力されたであろう所謂 login ID が入ってくる。 つまりこれに基づいて DAO 等を使って認証用の情報を取ってくればいい。

これはサンプルなので認証用のユーザー情報を直接 new している。

そしてこの loadUserByUsername は UserDetails という決まった形のインスタンスを返さないといけない。

このように実装する。

public class MyUser implements UserDetails{
    private static final long serialVersionUID = 1L;
 
    public enum Authority {ROLE_HOGE, ROLE_PIYO, ROLE_FUGA};
 
    @Override
    public Collection<? extends GrantedAuthority> getAuthorities() {
        List<GrantedAuthority> authorities = new ArrayList<>();
        authorities.add(new SimpleGrantedAuthority(Authority.ROLE_HOGE.toString()));
        authorities.add(new SimpleGrantedAuthority(Authority.ROLE_FUGA.toString()));
        return authorities;
    }
 
    @Override
    public String getPassword() {
        return "piyopiyo";
    }
 
    @Override
    public String getUsername() {
        return "hogehoge";
    }
 
    @Override
    public boolean isAccountNonExpired() {
        return true;
    }
 
    @Override
    public boolean isAccountNonLocked() {
        return true;
    }
 
    @Override
    public boolean isCredentialsNonExpired() {
        return true;
    }
 
    @Override
    public boolean isEnabled() {
        return true;
    }
}

所謂ユーザーに存在する認証用の属性があるのでそれをそれぞれ実装する。 これはサンプルなので、全部の値を固定値にしてある。

おそらく DB には認証用ではなく純粋にアカウント管理の Entity があると思われるので、 そのその Entity に toUserDetails のようなメソッドを実装して、 自身の情報を元に生成するという形になると思われる。

@Entity
public class Account{
    public UserDetails toUserDetails(){
        return new MyUser();
    }
}
java/spring/spring_boot/auth/spring_security/junk/user_details_service.txt · 最終更新: 2018-12-04 16:51 by ore