Kusto: отображение столбцов на основе разрешений - PullRequest
0 голосов
/ 11 июля 2020

Я пытаюсь получить доступ к параметрам функции в операторе case в этой функции и отображаю данные / «отфильтрованные» на основе флага разрешения .. Возможно ли это?

Usecase: TypeCast значение на основе columnType и проверьте, есть ли у пользователя разрешение на просмотр столбца, на основе которого вы отображаете значение или говорите что-то вроде «отфильтровано»

Вот что я пробовал

функция rls_columnCheck

.create-or-alter function rls_columnCheck(tableName:string, columnName: string, value:string, columnType:string, IsInGroupPII:bool, IsInGroupFinance:bool) {
    let PIIColumns = rls_getTablePermissions(tableName, "PII");
    let FinanceColumns = rls_getTablePermissions(tableName, "Finance");

    let val= case(columnType=="bool", tobool(value),
                  columnType=="datetime", todatetime(value),
                  columnType=="int", toint(value),
                  value);

    iif(columnName in (PIIColumns), 
        iif(columnName in (FinanceColumns), 
            iif(IsInGroupPII == true and IsInGroupFinance == true, 
                val, 
                "filtered"), // PII True, Fin True
            iif(IsInGroupPII == true, 
                val, 
                "filtered") // PII True, Fin False
        ), 
        iif(columnName in (FinanceColumns), 
            iif(IsInGroupFinance == true, 
                val, 
                "filtered"), // PII False, Fin True
            val // PII False, Fin False
        )
    );    
}

Ошибка:

Call to iff(): @then data type (int) must match the @else data type (string)

Ответы [ 2 ]

0 голосов
/ 12 июля 2020

Это не лучший подход к использованию RLS, потому что это фактически заставит движок запускать функцию для каждого столбца каждой записи. У него много недостатков:

  • Производительность отображения содержимого таблицы (даже если у вас есть полные разрешения)
  • Запросы в таблице не выиграют от индексов, хранящихся в Kusto (предположим, вы query PermissionTesting2 | where Col1 has “blablabla” - вместо проверки индекса на «blablabla» движку придется сканировать все данные, потому что он должен применять функцию для каждой отдельной ячейки)

Лучше сделать что-то вроде this :

let UserCanSeePII = current_principal_is_member_of('aadgroup=group1@domain.com');
let UserCanSeeFinance = current_principal_is_member_of('aadgroup=group2@domain.com');
let ResultWithPII = YourTable | where UserCanSeePII and (not UserCanSeeFinance) | where ... | extend ...;
let ResultWithFinance = YourTable | where UserCanSeeFinance and (not UserCanSeePII) | where ... | extend ...;
let ResultWithPIIandFinance = YourTable | where UserCanSeeFinance and UserCanSeePII | where ... | extend ...;
let ResultWithoutPIIandFinance = YourTable | where (not UserCanSeePII) and (not UserCanSeeFinance) | where ... | extend ...;
union ResultWithPII, ResultWithFinance, ResultWithPIIandFinance, ResultWithoutPIIandFinance
0 голосов
/ 11 июля 2020

val в вашей функции должен иметь один четко определенный тип данных, который известен во время «компиляции» запроса. у вас не может быть разных случаев, где в каждом он имеет другой тип (bool, datetime, int, string - в вашем case заявлении) - отсюда ошибка .

, если это имеет смысл в вашем случае использования, вы можете попробовать всегда вводить val как string.

...