我在前端使用msal(pkce)和 azure-active-directory-spring-boot-starter
在服务器上提供表示已登录用户及其声明的实体。
我已经建立了一个类来 Package 微软的 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"));
}
}
我通过一个helper类提供这个
@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);
}
}
这是可行的,但感觉不对。我想让我的客户 extend
userprincipal和have getPrincipal()
返回我的自定义类型(没有有效地重新实现我自己的 UserPrincipal
)而不是在成员对象前面提供一个facade。问题是userprincipal的构造函数需要jwt关注点,这表明这不是正确的方法。是否有另一种更合适的方法来为仅依赖于客户端声明的spring安全项目的用户建模?
暂无答案!
目前还没有任何答案,快来回答吧!