作为条件的范围内的时间的XACML规则

时间:2016-03-16 00:47:13

标签: authorization access-control xacml abac alfa

我想写一个使用条件语句构建一个规则的规则 XACML函数:" urn:oasis:names:tc:xacml:2.0:function:time-in-range"使用ALFA语言语法。由于容易处理义务,我宁愿在条件函数内部使用它,而不是在目标表达式中使用它 这可能吗?我在手册中没有找到任何参考。

在@David Brossard。根据以下方案,我使用以下ALFA代码测试了该政策:

def __init__(self, items=None):
    self.heap = [None]
    if items is None:
        self.heap_size = 0
    else:
        self.heap += items
        self.heap_size = len(items)
        self._build_heap()  # this a call to another method

语法验证运行正常,但是从WSO2 PDP代码返回的评估结果中存在错误,给出了" Permit"对于所有三个测试,02:00:00,10:00:00和22:00:00。

我已经隔离了这个问题。 WSO2 Try-It工具生成" String"默认情况下,XACML需要时间数据类型。要修复它,必须放置一个手动请求,并且@David Brossard显示的逻辑完美无缺。这是一个样本请求,生成一个" Permit"。

namespace com.ibm.XACML {
import Attributes.*
import attributes.*
import com.ibm.XACML.Attributes.*
  attribute currentTime {
            id = "urn:oasis:names:tc:xacml:1.0:environment:current-time"
            type = time
            category = environmentCat
        }   

function timeInRange = "urn:oasis:names:tc:xacml:2.0:function:time-in-range" : time time time -> boolean                
// lowerBound = "09:00:00-03:00"
// upperBound = "18:00:00-03:00"    
// current-time = "02:00:00-03:00" decision permit 
// current-time = "10:00:00-03:00" decision permit  
// current-time = "22:00:00-03:00" decision permit      

policy checkTimeInRange{
    apply firstApplicable
    rule allowWithinRange{
        permit
        condition timeInRange(timeOneAndOnly(currentTime), timeOneAndOnly(timeBag("09:00:00-03:00":time)), timeOneAndOnly(timeBag("19:00:00-03:00":time)))
        }
    }
}

" TimeInRange"函数结合Condition语句非常有帮助。

1 个答案:

答案 0 :(得分:1)

XACML standard我可以阅读

  

<强>瓮:绿洲:名称:TC:XACML:2.0:功能:时间在范围内的

     

此函数应采用数据类型time的三个参数,并返回boolean。如果第一个参数落在第二个和第三个参数包含的范围内,它将返回 True 。否则,它将返回“False”。

     

无论其值如何,第三个参数应被解释为等于或晚于不到二十四小时的第二个参数的时间。如果没有为第一个参数提供时区,则它应在上下文处理程序中使用默认时区。如果没有为第二个或第三个参数提供时区,那么它们应该使用第一个参数的时区。

ALFA也有这个功能。它被定义为

function timeInRange = "urn:oasis:names:tc:xacml:2.0:function:time-in-range" : time time time -> boolean

要使用它,只需执行以下操作:

policy checkTimeInRange{
    apply firstApplicable
    rule allowWithinRange{
        permit
        condition timeInRange(timeOneAndOnly(currentTime), timeOneAndOnly(lowerBound), timeOneAndOnly(upperBound))
    }
}

请注意,如果您缺少任何这些值,PDP将回复 Indeterminate