当前位置: 首页 > 面试题库 >

基于用户原则的Spring Data Rest中的存储库访问控制

东方镜
2023-03-14
问题内容

我正在尝试实现细粒度的访问控制,同时仍然利用Spring数据休息。

我正在努力保护,CrudRepository因此用户只能修改或插入属于他们的数据。我正在使用@PreAuthorize/
@PostAuthorize@PreFilter/ @PostFilter将访问权限锁定为当前的主体。

到目前为止,我的存储库看起来像这样。

public interface MyRepository extends CrudRepository<MyObject, Integer> {

    @PreAuthorize("#entity.userId == principal.id")
    @Override
    <S extends MyObject> S save(S entity);

    @PreFilter("filterObject.userId === principal.id")
    @Override
    <S extends MyObject> Iterable<S> save(Iterable<S> entities);

    @PostAuthorize("returnObject.userId == principal.id")
    @Override
    MyObject findOne(Integer integer);

    @PostFilter("filterObject.userId == principal.id")
    @Override
    Iterable<MyObject> findAll();

}

尽管这有点乏味,但它确实可以实现我所追求的目标。(如果有人知道更好的方法,请随时让我知道!)

当我遇到的问题是delete()count()exists()

    @Override
    long count();

    @Override
    void delete(Integer integer);

    @Override
    void delete(MyObject entity);

    @Override
    void deleteAll();

    @Override
    boolean exists(Integer integer);

这些方法要么采用IntegerID参数,要么根本不采用。看来我必须先选择具有输入ID的实体,然后执行身份验证检查。

存储库中是否可以进行这种类型的授权?

谢谢

编辑:

感谢ksokol,这似乎现在可以正常工作了。

我在@Configuration课上加了一个新豆

@Bean
public EvaluationContextExtension securityExtension() {
    return new SecurityEvaluationContextExtensionImpl();
}

这个bean扩展EvaluationContextExtensionSupport并覆盖getRootObject以返回一个SecurityExpressionRoot保存我的自定义主体的。

public class SecurityEvaluationContextExtensionImpl extends EvaluationContextExtensionSupport {
@Override
public String getExtensionId() {
    return "security";
}

@Override
public Object getRootObject() {
        Authentication authentication =   SecurityContextHolder.getContext().getAuthentication();
        return new SecurityExpressionRoot(authentication){};
    }
}

问题答案:

从Spring Security 4.0开始,您可以在Spring Data
JPA查询中访问安全上下文。

SecurityEvaluationContextExtensionbean 添加到您的bean上下文中:

@Bean
public SecurityEvaluationContextExtension securityEvaluationContextExtension() {
    return new SecurityEvaluationContextExtension();
}

现在您应该可以Principal在Spring Data查询中进行访问:

@Query("select count(m) from MyObject as m where m.user.id = ?#{ principal?.id }")
@Override
long count();

@Modifying
@Query("delete from MyObject as m where m.id = ?1 and m.user.id = ?#{ principal?.id }")
@Override
void delete(Integer integer);

@Modifying
@Query("delete from MyObject as m where m.id = ?1 and m.user.id = ?#{ principal?.id }")
@Override
void delete(MyObject entity);

@Modifying
@Query("delete from MyObject as m where m.user.id = ?#{ principal?.id }")
@Override
void deleteAll();

@Query("select 1 from MyObject as m where m.id = ?1 and m.user.id = ?#{ principal?.id }")
@Override
boolean exists(Integer integer);

警告。查询可能有错误。我没有时间测试它。



 类似资料:
  • 问题内容: 是否可以使用任何基于角色的开源访问控制系统? 问题答案: 布兰登·萨维奇(Brandon Savage)在他的PHP软件包“ ApplicationACL ” 上做了一个演示,该演示可能会或可能不会完成基于角色的访问。PHPGACL可能也能正常工作,但是我不能肯定地告诉您。 但是,我可以告诉您的是Zend Framework 的Zend_ACL组件将执行基于角色的设置(但是您必须子类化

  • 角色定义 [role_definition] 是RBAC角色继承关系的定义。 Casbin 支持 RBAC 系统的多个实例, 例如, 用户可以具有角色及其继承关系, 资源也可以具有角色及其继承关系。 这两个 RBAC 系统不会互相干扰。 此部分是可选的。 如果在模型中不使用 RBAC 角色, 则省略此部分。 [role_definition] g = _, _ g2 = _, _ 上述角色定义表

  • 以下内容是 xingzhou 对 kubernetes 官方文档的翻译,原文地址 https://k8smeetup.github.io/docs/admin/authorization/rbac/ 基于角色的访问控制(Role-Based Access Control, 即”RBAC”)使用”rbac.authorization.k8s.io” API Group实现授权决策,允许管理员通过Ku

  • 使用CBAC和RBAC的主要好处是什么?什么时候使用CBAC更好,什么时候使用RBAC更好? 我试图理解CBAC模型的一般概念,但总体思路对我来说仍然不清楚。

  • 我需要从消费者内部访问saga存储库,以读取与正在消费的消息相关的saga的当前状态。 场景:我有一个外部服务,当这个服务使用来自传奇的事件时,我想看看传奇是否仍然处于正确的状态,因为如果同时传奇改变了状态,消费者必须跳过事件。 如何:我当然可以通过使用它的本机框架来查询选择的saga存储库实现,但是我想使用一个抽象,一个接口,从消费者内部加载saga状态,以便将来能够切换到不同的存储库实现。 感

  • 我知道在基于角色的访问控制系统(RBAC)中,组织内的角色由角色表示。然后,每个角色都包含不同的任务(访问权限),以便在应用程序中执行操作。然后,根据其工作职责,为组织中的每个用户分配一个或多个角色。 我不明白的是RBAC中是否存在组。我目前正在设计一个系统,用户可以被分配一个或多个角色。然后,用户可以被放入1个或多个组(例如,程序员、12楼的人、穿金属t恤的人、国际象棋俱乐部的成员等),但这些组