XACML是您真正想要的解决方案。它是一种规则引擎,仅专注于访问控制。XACML是OASIS定义的标准,它定义了三个部分:
- 建筑
- 一种策略语言(这确实是您想要的)
- 请求/响应方案(您如何请求授权决定)。
架构如下:
- 策略决策点(PDP)是体系结构的核心部分。它是根据一组已知策略评估传入授权请求的组件
- 策略执行点(PEP)是保护您的应用程序/ API /服务的代码段。PEP拦截业务请求,创建XACML授权请求,将其发送给PDP,接收回响应,并在响应内部执行决策。
- 策略信息点(PIP)是可以将PDP连接到外部数据源(例如LDAP,数据库或Web服务)的组件。当PEP发送请求时,例如“ Alice可以查看文档#12?”时,PIP会派上用场。PDP的政策要求使用者的年龄。PDP将询问PIP“给我爱丽丝的年龄”,然后将能够处理这些政策。
- 策略管理点(PAP)是管理整个XACML解决方案(定义属性,编写策略和配置PDP)的地方。
这是您的第一个用例:
/*
* All users in department 1 with over 5 years of seniority can VIEW resource FOOBAR-1, else not authorized
*
*/
policy departmentOne{
target clause department == 1
apply firstApplicable
/**
* All users in department 1 with over 5 years of seniority can VIEW resource FOOBAR-1, else not authorized
*/
rule allowFooBar1{
target clause resourceId=="FOOBAR-1" and seniority>=5 and actionId=="VIEW"
permit
}
rule denyOtherAccess{
deny
}
}
您的第二个用例是:
/*
* "All users in department 2, if the date is after 03/15/2016, can VIEW resource FOOBAR-2, else not authorized"
*
*/
policy departmentTwo{
target clause department == 1
apply firstApplicable
rule allowFooBar2{
target clause resourceId=="FOOBAR-1" and seniority>=5 and currentDate>"2016/03/15":date and actionId=="VIEW"
permit
}
rule denyOtherAccess{
deny
}
}
您可以通过使用引用将两个用例组合到一个策略中:
policyset global{
apply firstApplicable
departmentOne
departmentTwo
}
大功告成!
您可以从以下网站阅读有关XACML和ALFA的更多信息: