我正在體驗我認爲可能是一個錯誤。委託人返回爲UsernamePasswordAuthenticationToken
我正在使用Spring Boot和Spring Security。通常情況下,一切都運行良好,但當我通過HttpServletRequest
或直接從控制器獲得委託人時,出於某種奇怪的原因將其轉換爲UsernamePasswordAuthenticationToken
。當我使用SecurityContextHolder.getContext().getAuthentication().getPrincipal()
時,它返回正確的對象。
請參閱下面的代碼,請參閱最後6行左右的註釋以瞭解實際返回的內容。
@RequestMapping(method = RequestMethod.POST)
public ElementDto postElement(@RequestBody @Valid ElementDto element, BindingResult bindingResult, HttpServletRequest httpServletRequest, Principal principal) {
logger.info("postElement - {}", element);
if (bindingResult.hasErrors()) {
throw new SpringBootCommonError(bindingResult.getAllErrors().get(0).getDefaultMessage(), SpringBootCommonErrorEnum.VALIDATION);
}
UsernamePasswordAuthenticationToken usernamePasswordAuthenticationToken = (UsernamePasswordAuthenticationToken)principal; /*is of type UsernamePasswordAuthenticationToken*/
Principal requestPrincipal = httpServletRequest.getUserPrincipal();/*is of type UsernamePasswordAuthenticationToken*/
Principal principalFromCast = (Principal)usernamePasswordAuthenticationToken.getPrincipal();/*is of type User (what I want)*/
Object securityPrincipal = SecurityContextHolder.getContext().getAuthentication().getPrincipal();/*is of type (what I want)*/
element.setUploadedBy(((User) httpServletRequest.getUserPrincipal()).getEntityNo());
return elementService.createElement(element);
}
我明白UsernamePasswordAuthenticationToken我的問題是,爲什麼是我的校長被返回UsernamePasswordAuthenticationToken例如下面的代碼工作 '((用戶)((UsernamePasswordAuthenticationToken)本金).getPrincipal())。getEntityNo()'但是這個代碼不不是'((用戶)主體).getEntityNo()' 我不認爲我應該把它轉換成UsernamePasswordAuthenticationToken,然後返回到本金,如果它最初是主體 –
它不是很清楚,你指的是什麼'委託人'在你的評論。這取決於身份驗證提供程序如何實現它。 HttpServeletRequest和SecurityContext都會返回你正確的主體,即UsernamePasswordAuthenticationToken – Simon