首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在系统中实现访问控制

在系统中实现访问控制
EN

Stack Overflow用户
提问于 2013-06-28 00:03:45
回答 3查看 1.4K关注 0票数 2

我在一个系统中遇到了许多不同的访问控制模型。在任何系统中实现访问控制模型时,我们通常通过为访问控制创建单独的表来硬编码数据库中的规则/权限(考虑RDBMS)。此外,这些规则/权限可以存储在XML数据库中。我想知道在RDBMS上存储规则和在XML数据库上存储规则有什么区别?另外,我们应该在什么时候使用XACML在系统中实现访问控制模型?我的意思是,如何决定是应该在数据库中硬编码规则/权限,还是应该使用XACML策略语言?

谢谢。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2013-07-01 01:03:41

免责声明:我在Axiomatics工作,它是XACML的供应商实现

如果您按照自己的方式存储授权逻辑,则可以在RDBMS或XML数据库中完成。无所谓。我怀疑XML是否会给您带来任何额外的功能。

现在,如果您想要一个可以满足RDBMS系统和其他类型的应用程序(CRM、.NET、Java...)的授权系统。然后,您希望使用与其保护的应用程序类型无关的解决方案。这就是eXtensible访问控制标记语言XACML的目标。

XACML提供基于属性、基于策略的访问控制(ABAC和PBAC)。这使您能够编写极具表现力的授权策略,并在单个存储库中对其进行集中管理。然后,中央授权引擎(称为策略决策点或PDP)将为您的不同应用程序提供决策服务。

正如Bell指出的,您需要的最小属性集通常是关于用户(主题)、资源和操作的属性。XACML还允许您添加环境属性。这意味着您可以编写以下类型的策略:

医生可以查看分配给他们的患者的医疗记录。

  • Doctors描述了user /subject
  • 视图,描述了
  • 医疗记录的操作,描述了目标资源,
  • of patients也描述了目标资源。分配给resource
  • they的元数据是一个有趣的例子。它是一个定义医生和病人之间关系的属性。在ABAC中,这被实现为doctor.id==patient.assignedDoctorId。这是使用XACML的主要好处之一。

XACML的好处包括:-贝尔提到的将授权逻辑具体化的能力-无需经历开发/部署生命周期即可更新授权逻辑的能力-以相同方式为许多不同的应用程序实现细粒度授权的能力-对授权逻辑进行可见性和审计的能力

HTH

票数 6
EN

Stack Overflow用户

发布于 2013-06-28 01:05:57

这两者并不是相互排斥的。

XACML策略描述如何将一组有关尝试的操作的属性转换为允许/拒绝的决策。至少,属性应该是用户是谁(主体),他们试图做什么(动作)和他们试图对什么做(对象)。可以添加诸如时间、请求源和许多其他信息。

用户和对象的属性仍然必须存储在数据库中。如果要对用户或对象进行分组以简化管理或简化访问控制规则的定义,则必须在数据库中管理所有这些内容。然后,所有这些数据都需要传递到XACML策略决策点,以返回允许/拒绝决策。

使用XACML定义这些规则,而不是为数据库中定义的规则编写自己的决策逻辑,其优点在于可以将规则的评估交给外部应用程序。使用成熟的、经过测试的XACML实现(有开放源码选项)可以避免在将检查构建到自己的代码中时出现任何错误。

票数 1
EN

Stack Overflow用户

发布于 2013-09-08 08:12:16

我认为在你的代码中硬编码策略是一个非常糟糕的做法。在这种情况下,您混合了资源的业务逻辑和访问控制系统的权限检查。XACML是朝着正确方向迈出的一大步,因为如果您将规则存储在单独的位置(而不是在业务逻辑中硬编码),则可以创建一个完全自动的访问控制系统。

顺便说一句,您也可以将这些规则存储在数据库中。例如(虚构的编程语言):

硬编码RBAC:

代码语言:javascript
复制
@xml

    role 1 editor

@/articles

ArticleController
    @GET /
    readAll () {
        if (session.notLoggedIn())
            throw 403;
        if (session.hasRole("editor"))
            return articleModel.readAll();
        else
            return articleModel.readAllByUserId(session.getUserId());
    }

非硬编码ABAC:

代码语言:javascript
复制
@db

    role 1 editor
        policy 1 read every article
            constraints
                endpoint GET /articles
            permissions
                resource
                projections full, owner

    role 2 regular user
        policy 2 read own articles
            constraints
                endpoint GET /articles
                logged in
            permissions
                resource
                projections owner


@/articles

ArticleController
    @GET /
    readAll () {
        if (session.hasProjection(full))
            return articleModel.readAll();
        else if (session.hasProjection(owner))
            return articleModel.readAllByUserId(session.getUserId());
    }

正如您所看到的,由于代码分离,非硬编码的代码比硬编码的代码清晰得多。

XACML是一个标准(它比上面的例子了解的多10倍),所以你不必通过每个项目学习一个新的访问控制系统,也不必在每种语言中实现XACML,因为如果你幸运的话,其他人已经这样做了……

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/17347996

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档