Spring Security从Web服务获取角色

时间:2015-08-04 14:37:57

标签: java spring web-services spring-mvc spring-security

希望使用带有注释的Spring MVC + Spring Security。 Spring Security具有从XML文件或数据库获取角色信息的强大功能。但是,我们的角色信息可以从定制的SOAP Web服务访问。有关如何从Web服务获取角色信息的任何想法吗?

理想情况下,我想覆盖hasRoles()等并修改它,然后调用SOAP WS并返回用户的角色。我该怎么做?

还是其他任何想法?

1 个答案:

答案 0 :(得分:1)

如果在使用spring-security时需要自定义属性,则必须实现自己的UserDetailsService接口,该接口包含以下方法:

public UserDetails loadUserByUsername(final String email)

因此,在从数据源检索用户后,将调用添加到您的角色Web服务......就像这样:

public class UserDetailsExtendedService implements UserDetailsService {
    @Autowired
    private UsersDAO usersDao;

    private UserDetails prepare(com.data.User user) {
        boolean enabled = user.getState().equals(UserState.Active);

        Collection<GrantedAuthority> authorities = new ArrayList<GrantedAuthority>();
        for (UserRole r: /*CALL TO WEB-SERVICE*/) {
          authorities.add(new GrantedAuthorityImpl(r.getName()));
        }

        return new UserDetails(user.getId(), user.getEmail(), user.getPassword(), user.getNickname(), user.getPosition(), user.getAvatar(), user.getCommunicationLanguage().getCode(), 
            user.getNotificationChannel(), user.getPartnerId(), enabled, enabled, enabled, enabled, authorities);
    }

    @Override
    @Transactional(readOnly = true)
    public UserDetails loadUserByUsername(final String email)
            throws UsernameNotFoundException, DataAccessException, HibernateException {
        com.data.User user = usersDao.getByEmail(email);
        if (user == null)
            throw new UsernameNotFoundException(email);

        return prepare(user);
    }
}