Spring Security自定义UserDetailsS​​ervice和自定义User类

时间:2014-08-19 12:19:59

标签: java spring security jpa spring-security

我正在尝试在de user principal对象中保存其他数据。

我做的是:

实施" UserDetails"保存我的附加数据的现有用户类的接口(如电子邮件地址等)。

@Entity
public class User implements UserDetails {

然后我创建了一个UserDetailsS​​ervice实现:

@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;
    }

}

最后一步是在我的安全配置中添加UserDetailsS​​ervice。

@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"被叫两次(因为"找到"输出)。

当我尝试访问控制器中的主要对象时 - >

System.out.println(SecurityContextHolder.getContext()
                .getAuthentication().getPrincipal());

我没有得到我的额外数据。 当我尝试将它转换为我的User对象时,我得到一个无法转换异常。

我有什么遗漏吗?

提前谢谢。

2 个答案:

答案 0 :(得分:12)

确定。我的问题隐藏在我没有发布的代码中。

我认为这个detailsS​​ervice只是为了获得更多细节,但它用于登录本身。

我有" jdbcAuthentication"另外配置,弹簧似乎总是使用它。

现在我只配置了detailsS​​ervice,一切正常。

编辑:

所以我只需删除此代码:

auth.jdbcAuthentication() .dataSource(dataSource)
     * .passwordEncoder(passwordEncoder) .usersByUsernameQuery(
//   ....

现在它也适用于上面问题中的代码。

答案 1 :(得分:1)

创建扩展类:

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;
    }
}

然后将其添加到UserDetailsS​​ervice:

@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()