menu
書いてる野郎
orebike@gmail.com
認証情報取得用 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(); } }