web-dev-qa-db-ja.com

SPRING:カスタムユーザーの詳細をSpring Securityユーザーに追加します

現在、Spring MVCアプリケーションで作業しており、ログイン時にカスタムフィールドをSpring Securityログインユーザーに追加する必要があります(ユーザー名、パスワード、カスタム値を挿入します)。この値は、ユーザーがログインしているすべての場所で利用可能である必要があります(pricipal.getValueなどを使用)。

カスタムユーザークラスとカスタムサービスについてよく読みましたが、実際に問題の解決策を見つけることができません...

どんな助けも素晴らしいでしょう!

10
counter1602

Avinashが言ったように、UserクラスにUserDetailsを実装させることができます。また、UserDetailsServiceを実装し、対応するメソッドをオーバーライドしてカスタムUserオブジェクトを返すこともできます。

@Service("userDetailsService")
public class MyUserDetailsService implements UserDetailsService {

    //get user from the database, via Hibernate
    @Autowired
    private UserDao userDao;

    @Transactional(readOnly=true)
    @Override
    public UserDetails loadUserByUsername(final String username)
        throws UsernameNotFoundException {
//CUSTOM USER HERE vvv
        User user = userDao.findByUserName(username);
        List<GrantedAuthority> authorities =
                                      buildUserAuthority(user.getUserRole());
//if you're implementing UserDetails you wouldn't need to call this method and instead return the User as it is
        //return buildUserForAuthentication(user, authorities);
return user;

    }

    // Converts user to spring.springframework.security.core.userdetails.User
    private User buildUserForAuthentication(user,
        List<GrantedAuthority> authorities) {
        return new User(user.getUsername(), user.getPassword(),
            user.isEnabled(), true, true, true, authorities);
    }

    private List<GrantedAuthority> buildUserAuthority(Set<UserRole> userRoles) {

        Set<GrantedAuthority> setAuths = new HashSet<GrantedAuthority>();

        // add user's authorities
        for (UserRole userRole : userRoles) {
            setAuths.add(new SimpleGrantedAuthority(userRole.getRole()));
        }

        List<GrantedAuthority> Result = new ArrayList<GrantedAuthority>(setAuths);

        return Result;
    }

}

そして、カスタムWebConfigurerAdapterを使用してUserdetailsServiceを設定するだけです:

@Configuration
@EnableWebSecurity
public class SecurityConfig extends WebSecurityConfigurerAdapter {
@Autowired
@Qualifier("userDetailsService")
UserDetailsService userDetailsService;

@Autowired
public void configureGlobal(AuthenticationManagerBuilder auth) throws Exception {
    auth.userDetailsService(userDetailsService).passwordEncoder(passwordEncoder());
}

@Override
protected void configure(HttpSecurity http) throws Exception {

    //authorization logic here ...
}

    @Bean
    public PasswordEncoder passwordEncoder(){
        // return preferred PasswordEncoder ...//
    }


}

ここで、カスタムUserDetails実装のサンプル: custom UserDetails

18
Daniel Arechiga

UserDetailsインターフェイスを実装するクラスを作成します。

public class User implements UserDetails {
    // Your user properties
    // implement methods
}

そして、認証されると、このオブジェクトにプロジェクトのどこからでもアクセスできます。

User user = (User) SecurityContextHolder.getContext().getAuthentication().getPrincipal();
8
Avinash