首页 > 解决方案 > 具有身份验证的 Spring Boot 自定义用户

问题描述

我正在尝试使用我想要的属性进行自定义用户并使用身份验证,CustomUser 扩展了 spring User,用户由实现 UsersDetailsS​​ervice 的 CustomProvider 返回

@Service
@Qualifier("UserDetailsService")
public class CustomUserDetailsService implements UserDetailsService {

    @Autowired
    private UserRepository userRepository;

    @Override
    @Transactional
    public UserDetails loadUserByUsername(String email) throws UsernameNotFoundException {
        User user=userRepository.findByEmail(email);
        return new CustomUser(user.getName(),user.getPassword(),buildUserAuthority(user.getRoles()));
    }

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

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

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

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

        return Result;
    }


    @Getter
@Setter
public class CustomUser extends User {

    public CustomUser(String username, String password, Collection<? extends GrantedAuthority> authorities) {
        super(username, password, authorities);
    }

    public String firstName;
    public String lastName;
}


@Configuration
@EnableWebSecurity
public class SecurityConfiguration extends WebSecurityConfigurerAdapter {
 @Autowired
    @Qualifier("UserDetailsService")
    private UserDetailsService customUserDetailsService;


    @Override
    protected void configure(AuthenticationManagerBuilder auth)
            throws Exception {
     /*   auth.
                jdbcAuthentication()
                .usersByUsernameQuery(usersQuery)
                .authoritiesByUsernameQuery(rolesQuery)
                .dataSource(dataSource)
                .passwordEncoder(bCryptPasswordEncoder);
*/
        auth.userDetailsService(customUserDetailsService);
    }
}

我有两个问题:

1-我已经评论了 auth.jdbcAuthentication 因为我不能让身份验证和 customProvider 一起工作,我如何使用 customuser 的数据库身份验证?

2-如果我评论 jdbcAuthentication customuser 工作,但是当我得到委托人时,密码为空: authentication.getPrincipal().getPassword()


更新 :

我已经通过 eraseCredentials(false) 解决了 2,但仍然无法同时执行这两个操作(使用自定义用户进行身份验证)

标签: javaspringspring-bootspring-security

解决方案


老答案:

我已经解决了这个问题:

auth.eraseCredentials(false).userDetailsService(customUserDetailsService).and().jdbcAuthentication()
                .usersByUsernameQuery(usersQuery)
                .authoritiesByUsernameQuery(rolesQuery)
                .dataSource(dataSource)
                .passwordEncoder(bCryptPasswordEncoder);

更新:

我发现不需要使用 2 种身份验证,因为 spring 会与返回的用户验证密码。


推荐阅读