Sprint Rest AuthenticationPrincipal返回只有空值的customUser

时间:2018-10-09 12:38:18

标签: spring-mvc spring-security

我正在尝试在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
}

这是我的 UserDetailsS​​ervice

@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的开源代码

1 个答案:

答案 0 :(得分:1)

我尝试并调试了您的代码,但找不到问题
@AuthenticationPrincipal。通常,此注释由Spring安全性Web注释的AuthenticationPrincipalArgumentResolver类解析。通过使用@EnableWebSecurity,您将自动将其添加到Spring MVC配置中。需要对AuthenticationPrincipalArgumentResolver进行更多调试,暂时建议使用Authentication类并获取对象。