2017-07-03 89 views
-1

我需要在非默认的Spring链中检索完全主体对象(不在控制器中使用主注入)。我正在用我的spring-websocket和客户端实现一些拦截器,以从oauth标头令牌值设置用户Principal。春季安全检索主体对象

现在的主要问题是,我不能直接抓取主体对象,而是获取用户名字符串。

我创造了这个方法,但它返回的字符串(获得抛出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(); 
} 

回答

0

我已经仅调用此方法计算出来:

SecurityContextHolder.getContext().getAuthentication() 

认证已经是校长(超类)与类层次结构

+0

如果您在'@ Controller'里面,你可以添加'Authentication'作为方法参数,并且Spring会注入它。 –

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包含Object类型的principal对象,所以在这里你可以设定UserDetailString对象根据您的要求