放松Spring Data REST投影的安全性

for*_*rtm 5 spring spring-security spring-data spring-data-rest

我有一个User类,我想授权访问,只有用户才能看到他有权使用的内容.

使用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);

}
Run Code Online (Sandbox Code Playgroud)

通过这种方式,用户在访问Spring Data REST脚手架网址时会像 -

/users/{id}
/users/{id}/userPosts
Run Code Online (Sandbox Code Playgroud)

只有那些用{id}登录的人才能看到这些,其他人都得到了我想要的401.

我的问题是我有一个Projections,它是每个用户的公共视图,我正在使用Spring Data Rest投影进行创建,如下所示我希望每个{id}都可以访问

@Projection(name = "details", types = User.class)
public interface UserDetailsProjection {
..
}
Run Code Online (Sandbox Code Playgroud)

因此,即使用户登录,/users/{id1}?projection=details/users/{id2}?projection=details应该提供200 OK并显示数据{id1}

我开始通过使用@PreAuthorize("permitAll")标记投影来实现这一点,但由于存储库具有更难的安全检查,因此无法工作.我们是否可以将此功能用于预测,我们可以放松安全性?

我正在使用最新的Spring Data Rest和Spring Security发行版

Mit*_*hun 0

在数据访问层添加spring security代码并不是一个好主意。我建议您将@PreAuthorize注释添加到控制器/服务方法中。由于您有一个查询参数 ,因此?projection=details您可以为详细信息投影使用单独的控制器/服务方法。

将以下内容添加到您的详细信息投影方法中:

@RequestMapping("/url", params = {"projection"})
@PreAuthorize("hasRole('LOGGED_IN') and principal.user.id == #id")
Run Code Online (Sandbox Code Playgroud)

  • 我对这种方法有一个问题,即使用 Spring Data Rest 所有控制器和服务都是由框架生成的,因此我只能处理可以配置安全性的存储库。我也有自定义 URL,这个解决方案非常适合。除非我完全弄错了,否则您能否告诉我如何保护 Spring Data Rest 生成的 URL(如 /users/{id} 和 /users/{id}/userPosts ),就像我在帖子中提到的那样,而不在存储库中添加这些注释? (2认同)