【问题标题】:Sprint Rest AuthenticationPrincipal returns customUser with only null valuesSprint Rest AuthenticationPrincipal 返回仅具有空值的 customUser
【发布时间】:2018-10-22 03:15:36
【问题描述】:

我正在尝试在 Spring Boot REST 后端获取当前登录的用户(基本身份验证):

@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
}

这是我的自定义 UserModel

@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;

   [...]
}

这是我的UserDetailsS​​ervice

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);
  }
}

最后是 LiquidoAuthUser

public class LiquidoAuthUser extends User {  
  private UserModel liquidoUserModel;

  public LiquidoAuthUser(String username, String password, Collection<? extends GrantedAuthority> authorities, UserModel liquidoUserModel) {
    super(username, password, authorities);
    this.liquidoUserModel = liquidoUserModel;
  }

  public UserModel getLiquidoUserModel() {
    return liquidoUserModel;
  }

  public void setLiquidoUserModel(UserModel userModel) {
    this.liquidoUserModel = userModel;
  }
}

当然,我的主 SpringApplication 类上有 @EnableWebMvc 注释。

我的问题:如何在 REST 处理程序中获取当前经过身份验证的自定义 UserModel?

奇怪的是:我实际上可以从 Authentication auth 对象中获取我的自定义用户。为什么@AuthenticationPrincipal 不起作用?

我正在使用 spring-security-4.1.3-RELEASE

完整代码在https://github.com/Doogiemuc/liquido-backend-spring开源

【问题讨论】:

    标签: spring-mvc spring-security


    【解决方案1】:

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

    【讨论】:

      猜你喜欢
      • 2017-04-24
      • 2020-03-10
      • 2023-02-09
      • 2014-12-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-12-28
      • 2022-12-20
      相关资源
      最近更新 更多