gpt4 book ai didi

spring - 放松 Spring Data REST 投影的安全性

转载 作者:行者123 更新时间:2023-12-04 21:14:04 24 4
gpt4 key购买 nike

我有一个 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);

}

这样,用户在访问 Spring Data REST 脚手架 URL 时,例如 -
/users/{id}
/users/{id}/userPosts

只有使用 {id} 登录的人才能看到这些,而其他所有人都会像我想要的那样得到 401。

我的问题是我有一个 Projections,它是每个用户的公共(public) View ,我正在使用 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") 标记投影来实现这一点,但这不起作用,因为 Repository 具有更难的安全检查。我们可以在投影的地方放宽安全性吗?

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

最佳答案

为此用例添加自定义 Controller 似乎是合理的。

还请考虑:

  • 使用 @Value 评估投影中的访问权限注释
  • 为相同的数据库数据添加另一个实体,但为只读操作设置不同的字段,例如使用继承(注意缓存等) - 取决于您的数据存储类型
  • 修改模型拆分 User实体分为两个不同的实体(配置文件、帐户),因为它们似乎具有不同的访问权限,甚至可能具有不同的操作
  • 您也可以添加 ResourceProcessor<UserSummaryProjection>以编程方式评估访问并用 DTO
  • 替换资源内容(投影)

    的示例在预测中评估访问 @Value注释:
    @Projection(types = User.class, name = "summary")
    public interface UserSummaryProjection {
    @Value("#{@userSecurity.canReadEmail(target) ? target.email: null}")
    String getEmail();
    }

    关于spring - 放松 Spring Data REST 投影的安全性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28579526/

    24 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com