我正在尝试在Spring Boot REST后端中获取当前登录的用户(基本身份验证):
renderer(_:nodeFor:)
这是我的自定义 UserModel
@RequestMapping(value = "/someURL", method = RequestMethod.GET)
public @ResponseBody Map someMethod(
Authentication auth, // <==== works
@AuthenticationPrincipal(expression = "liquidoUserModel") UserModel liquidoUserModel
)
{
log.debug(auth.getPrincipal()) // <==== THIS WORKS
log.debug(liquidoUserModel) // <==== returns an intance with empty fields
}
这是我的 UserDetailsService
@Data // Lombok magic for all the getters and setters
@Entity
@RequiredArgsConstructor
@Table(name = "users")
public class UserModel {
@Id
Long id;
@NonNull
@Column(unique = true)
public String email;
[...]
}
最后是 LiquidoAuthUser
public class LiquidoUserDetailsService implements UserDetailsService {
@Autowired
UserRepo userRepo;
@Override
public LiquidoAuthUser loadUserByUsername(String email) throws UsernameNotFoundException {
UserModel userModel = userRepo.findByEmail(email);
return new LiquidoAuthUser(userModel.getEmail(), userModel.getPasswordHash(), getGrantedAuthorities(userModel), userModel);
}
}
当然,我在主SpringApplication类上有@EnableWebMvc注释。
我的问题:我如何在REST处理程序中获取当前经过身份验证的自定义UserModel?
奇怪的是:实际上,我可以从Authentication auth对象获得我的自定义用户。为什么@AuthenticationPrincipal不起作用?
我正在使用spring-security-4.1.3-RELEASE
完整代码是https://github.com/Doogiemuc/liquido-backend-spring的开源代码
答案 0 :(得分:1)
我尝试并调试了您的代码,但找不到问题
@AuthenticationPrincipal。通常,此注释由Spring安全性Web注释的AuthenticationPrincipalArgumentResolver类解析。通过使用@EnableWebSecurity,您将自动将其添加到Spring MVC配置中。需要对AuthenticationPrincipalArgumentResolver进行更多调试,暂时建议使用Authentication类并获取对象。