ユーザープリンシパルオブジェクトに追加データを保存しようとしています。
私がしたことは:
追加データが保存される既存のユーザークラスに「UserDetails」インターフェースを実装します(電子メールアドレスなど)。
@Entity
public class User implements UserDetails {
次に、UserDetailsService実装を作成しました。
@Service
public class UserDetailsServiceImpl implements UserDetailsService {
@Autowired
UserDAO userDAO;
@Override
public UserDetails loadUserByUsername(String username)
throws UsernameNotFoundException {
User user = userDAO.findOneByUsername(username);
if (user == null)
throw new UsernameNotFoundException("username " + username
+ " not found");
System.out.println("---------------------> FOUND ------------->"
+ user.getEmail());
return user;
}
}
最後の手順は、セキュリティ構成にUserDetailsServiceを追加することでした。
@Configuration
@EnableWebMvcSecurity
public class SecurityConfiguration extends WebSecurityConfigurerAdapter {
@Autowired
UserDetailsService userDetailsService;
@Override
protected void configure(AuthenticationManagerBuilder auth)
throws Exception {
auth.userDetailsService(userDetailsService());
// ...
}
@Override
protected void configure(HttpSecurity http) throws Exception {
http.userDetailsService(userDetailsService());
// ...
}
@Override
protected UserDetailsService userDetailsService() {
return userDetailsService;
}
コンソールでは、「loadUserByName」が2回呼び出されることがわかります(「Found」出力のため)。
コントローラーのプリンシパルオブジェクトにアクセスしようとすると->
System.out.println(SecurityContextHolder.getContext()
.getAuthentication().getPrincipal());
追加データを取得できません。ユーザーオブジェクトにキャストしようとすると、キャストできませんでした例外が発生します。
不足しているものはありますか?
前もって感謝します。
OK。私が投稿しなかったコードに私の問題が隠されていました。
このdetailsServiceは追加の詳細を取得するためだけのものであると考えましたが、ログイン自体に使用されます。
私は「jdbcAuthentication」を追加で設定しましたが、springはこれを常に使用しているようです。
これで、detailsServiceのみが設定され、すべてが正常に機能するようになりました。
編集:
だから私はこのコードを削除するだけでした:
auth.jdbcAuthentication() .dataSource(dataSource)
* .passwordEncoder(passwordEncoder) .usersByUsernameQuery(
// ....
そして今、それは上記の質問の私のコードでも動作します。
拡張クラスを作成します。
public class CustomUserDetails extends org.springframework.security.core.userdetails.User{
private User user;
public CustomUserDetails(User user, Collection<? extends GrantedAuthority> authorities) {
super(user.getName(), user.getPassword(), authorities);
this.user = user;
}
public CustomUserDetails(User user, boolean enabled, boolean accountNonExpired, boolean credentialsNonExpired, boolean accountNonLocked, Collection<? extends GrantedAuthority> authorities) {
super(user.getName(), user.getPassword(), enabled, accountNonExpired, credentialsNonExpired, accountNonLocked, authorities);
this.user = user;
}
public User getUser() {
return user;
}
}
UserDetailsServiceに追加するより:
@Service("userDetailsService")
public class UserDetailsServiceImpl implements UserDetailsService {
public UserDetails loadUserByUsername(String login) throws UsernameNotFoundException, DataAccessException {
UserDetails userDetails = null;
User user = userService.getByLogin(login);
userDetails = new CustomUserDetails(user,
true, true, true, true,
getAuthorities(user.getRole()));
return userDetails;
}
それを得る!
(CustomUserDetails) SecurityContextHolder.getContext().getAuthentication().getPrincipal()