Spring Secutiry检索主要对象

时间:2017-07-03 19:52:59

标签: spring spring-mvc spring-security

我需要在非默认的Spring链中检索确切的Principal Object(不是在带有Principle注入的控制器中)。我正在使用spring-websocket和client实现一些拦截器,以便从oauth头标记值设置用户Principal。

现在的主要问题是我无法直接获取Principal对象,而是获取用户名String。

我已创建此方法,但它返回String(获取ClassCastException):

public Principal setApplicationAuthentication(String username) {
    UserDetails userDetails = userDetailsService.loadUserByUsername(username);
    Authentication auth = new UsernamePasswordAuthenticationToken(userDetails.getUsername(),
            userDetails.getPassword(), userDetails.getAuthorities());
    SecurityContextHolder.getContext().setAuthentication(auth);
    return (Principal) SecurityContextHolder.getContext().getAuthentication().getPrincipal();
}

2 个答案:

答案 0 :(得分:0)

我只是通过调用此方法来解决这个问题:

SecurityContextHolder.getContext().getAuthentication()

身份验证已经是具有类层次结构

的Principal(超类)

答案 1 :(得分:0)

试试这个:

public Principal setApplicationAuthentication(String username) {
    UserDetails userDetails = userDetailsService.loadUserByUsername(username);
    Authentication auth = new UsernamePasswordAuthenticationToken(userDetails,
            userDetails.getPassword(), userDetails.getAuthorities());
    SecurityContextHolder.getContext().setAuthentication(auth);
    return (Principal) SecurityContextHolder.getContext().getAuthentication().getPrincipal();
}

这将为您提供当前登录的实际主要对象。 请注意,UsernamePasswordAuthenticationToken包含principal类型的Object对象,因此您可以根据需要设置UserDetailString对象