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发行版
在数据访问层添加spring security代码并不是一个好主意。我建议您将@PreAuthorize注释添加到控制器/服务方法中。由于您有一个查询参数 ,因此?projection=details您可以为详细信息投影使用单独的控制器/服务方法。
将以下内容添加到您的详细信息投影方法中:
@RequestMapping("/url", params = {"projection"})
@PreAuthorize("hasRole('LOGGED_IN') and principal.user.id == #id")
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
700 次 |
| 最近记录: |