我在前端 (PKCE) 和azure-active-directory-spring-boot-starter
服务器上使用 MSAL 来提供一个代表登录用户及其声明的实体。
我构建了一个包含 Microsoft 的类,UserPrincipal
以提供对众所周知的声明的轻松访问:
import com.microsoft.azure.spring.autoconfigure.aad.UserPrincipal;
public class MyCustomUser {
private UserPrincipal userPrincipal;
public MyCustomUser(UserPrincipal userPrincipal) {
this.userPrincipal = userPrincipal;
}
public String getEmployeeId() {
return String.valueOf(this.userPrincipal.getClaim("emplid"));
}
}
我通过帮助类提供它
@Component
public class MyAppSecurityContext {
public MyCustomUser getUser() {
UserPrincipal principal = (UserPrincipal) SecurityContextHolder.getContext().getAuthentication().getPrincipal();
return new MyCustomUser(principal);
}
}
然后在我的服务层中使用它:
@Service
public class AnnouncementServiceImpl implements AnnouncementService {
@Autowired
private MyAppSecurityContext securityContext;
@Override
public List<Announcement> saveAnnouncement(Announcement announcement) {
MyCustomUser currentUser = this.securityContext.getUser();
String empid = currentUser.getEmployeeId();
return this.announcementRepository.saveAnnouncement(empid, announcement);
}
}
这行得通,但感觉不对。我宁愿拥有 MyCustomUser extend
UserPrincipal 并getPrincipal()
返回我的自定义类型(没有有效地重新实现我自己的UserPrincipal
),而不是在成员对象前面提供外观。问题是 UserPrincipal 的构造函数需要 JWT 关注点,这表明这不是正确的方法。是否有另一种更合适的方法来为仅依赖于客户端声明的 Spring 安全项目的用户建模?