在 spring-security 的身份验证中无法获取自定义信息
Posted
技术标签:
【中文标题】在 spring-security 的身份验证中无法获取自定义信息【英文标题】:Can not get custom information in Authentication of spring-security 【发布时间】:2020-08-26 18:30:20 【问题描述】:这是我在授权服务器中的AuthenticationProvider
@Service
public class UmUserAuthenticationProvider implements AuthenticationProvider
@Autowired
@Qualifier("UmUserDetailsService")
private UserDetailsService userDetailService;
@Override
public Authentication authenticate(Authentication authentication) throws AuthenticationException
// TODO Auto-generated method stub
String username = authentication.getName();
String password = (String) authentication.getCredentials();
long userId = (new SecurityUtil()).checkUser(umUserMapper, username, password);
if (userId <= 0)
throw new BadCredentialsException("login failed");
UserDetails user = userDetailService.loadUserByUsername(username);
//I've try different ways to put user detail in here
UsernamePasswordAuthenticationToken auth = new UsernamePasswordAuthenticationToken(user, null,
user.getAuthorities());
auth.setDetails(user);
return auth;
@Override
public boolean supports(Class<?> authentication)
// TODO Auto-generated method stub
return authentication.equals(UsernamePasswordAuthenticationToken.class);
这是我的资源服务器,我无法获取我在Authentication
中设置的内容,
getPrincipal
是String
getDetails
是 org.springframework.security.oauth2.provider.authentication.OAuth2AuthenticationDetails
的类型
@RequestMapping("/test")
public class UserController
private final Logger logger = LoggerFactory.getLogger(this.getClass());
@RequestMapping(value = "/test", method = RequestMethod.GET)
public String getRouters()
Authentication auth = SecurityContextHolder.getContext().getAuthentication();
logger.info(auth.getPrincipal().toString());
logger.info(auth.getDetails().toString());
JSONObject jo = new JSONObject();
return jo.toString();
记录器打印
那么我如何在Authentication
中获取自定义详细信息?
【问题讨论】:
您要实施什么样的身份验证?智威汤逊?在我看来,这是在 Spring Security 中实现身份验证的一个奇怪的奇怪解决方案 【参考方案1】:最后,我用诡计解决了这个问题
无论我在UsernamePasswordAuthenticationToken
中设置什么,我都得到了String
的类型,所以我用json字符串填充它;
UsernamePasswordAuthenticationToken auth = new UsernamePasswordAuthenticationToken(
new JSONObject(user).toString(), password, userDetailService.getAuthorities(username));
这样我就可以在控制器上解析 json 字符串了。
但我还是想知道是什么原因造成的
【讨论】:
【参考方案2】:我认为问题在于,您在身份验证时设置了UserDetails
,但默认情况下会覆盖它。
自定义身份验证转换器可能是解决方案。
public class CustomAuthenticationConverter implements Converter<Jwt, AbstractAuthenticationToken>
@Override
public AbstractAuthenticationToken convert(@NotNull final Jwt jwt)
String username = jwt.getClaimAsString("username");
UserDetails user = userDetailService.loadUserByUsername(username);
return new UsernamePasswordAuthenticationToken (jwt, user, userDetailService.getAuthorities(username)));
【讨论】:
以上是关于在 spring-security 的身份验证中无法获取自定义信息的主要内容,如果未能解决你的问题,请参考以下文章
Spring-Security:MySQL JDBC 身份验证失败
通过 Active Directory LDAP 使用 Spring-Security 进行身份验证
如何使用我自己的机制自定义 spring-security 身份验证过程