【发布时间】: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;
[...]
}
这是我的UserDetailsService
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
【问题讨论】:
标签: spring-mvc spring-security