我有一个用户类,我想授权访问,以便只有用户可以看到他被授权的内容。
使用Spring Security与Spring Data Rest相结合,在JPA Repository中实现以下内容,这很容易实现 -
public interface UserRepository extends JPARepository<User,Integer> {
@PreAuthorize("hasRole('LOGGED_IN') and principal.user.id == #id")
User findOne(@Param("id") Integer id);
}
以这种方式,当用户访问像Spring Data REST脚手架URL这样的网址时 -
/users/{id}
/users/{id}/userPosts
只有使用{ id }登录的用户才能看到这些内容,其他人都会得到401错误提示,就像我想要的那样。
我的问题是,我有一个投影(Projections),它是每个用户的公共视图,我正在使用Spring Data Rest投影来创建它,如下所示,我希望每个{ id }都可以访问:
@Projection(name = "details", types = User.class)
public interface UserDetailsProjection {
..
}
所以,
/users/{id1}?projection=details
和 /users/{id2}?projection=details
应该返回200 OK并显示数据,即使用户已经登录为 {id1}
。我开始通过使用 @PreAuthorize("permitAll") 对投影进行标记来实现这一点,但这不会起作用,因为存储库具有更严格的安全检查。我们可以在投影中放宽安全性,实现此功能吗?
我正在使用最新的Spring Data Rest和Spring Security发行版。