【发布时间】:2017-12-29 23:20:49
【问题描述】:
RESPApi项目的设置是:
- SpringBoot
- Spring 的 OAuth2
在项目中,我们有很多客户端,因此 SQL 查询几乎总是在 where 子句中包含 "... and clientId = ?"。
我们将clientId 与其他用户详细信息一起存储在SecurityContext 中(我们扩展了Spring 的User 类)。
问题是:如何获取@Repository中的User对象?
我们能想到的可能解决方案:
- 在每个存储库实现中添加
SecurityContextHolder.getContext().getAuthentication()
将结果转换为我们的自定义 UserDetails 实现并使用它。
缺点:不知何故,我觉得有更好的解决方案。
- 将
@AuthenticationPrincipal注解的参数添加到控制器,然后将参数传递给服务层,然后再传递到存储库层。
缺点:通过 2 层参数仅获得clientId 似乎不合理。
我想到了@Repository 类中的@Autowired 参数MyUser user。第一次尝试是创建@Configuration 注释类,其中将有一个方法
@Bean
public MyUser getUser() {
SecurityContext context = SecurityContextHolder.getContext();
if (context != null) {
Authentication authentication = SecurityContextHolder.getContext().getAuthentication();
if (authentication != null) {
return (MyUser) authentication.getPrincipal();
}
}
return null;
}
但是 bean 是空的,我不能使用它。
目前我们已经找到了解决方案 nr 1,但我觉得一定有更好的方法。
任何想法如何解决这个问题?
【问题讨论】:
标签: java spring spring-mvc spring-security spring-security-oauth2