Роли уровня строк :: Не работают предикаты

Если создать какой-нибудь предикат для роли уровня строк и закрепить роль за пользователем, то она не работает.

Например

@Nonnull
@RowLevelRole(
    name = "Hr can only see certain types of employees",
    code = "hr-view-certain-types-employees"
)
interface HrViewCertainTypesEmployees {
    @PredicateRowLevelPolicy(entityClass = Employee::class, actions = [RowLevelPolicyAction.READ])
    fun employeePredicate(): RowLevelBiPredicate<Employee, ApplicationContext> {
        return RowLevelBiPredicate { employee, applicationContext ->
            employee.getEmployeeType() != EmployeeType.SUBCONTRACTOR_LEGAL_ENTITY
        }
    }
}

image

Созданная политика даже не отображается в описание роли уровня строк. Следовательно, если закрепить роль за пользователем, то она не работает

Скорее всего проблема в том что тут метод интерфейса не default (В документации на java метод default).

Попробуйте добавить методу аннотацию JvmDefault(при этом в аргументы программы нужно передать -Xjvm-default=enable или -Xjvm-default=compatibility. Посмотрите в описании класса JvmDefault что вам больше подходит.

Возможно в вашем приложении падает error: PredicateRowLevelPolicy method should return either RowLevelPredicate or RowLevelBiPredicate

Встаньте дебагом в метод PredicateRowLevelPolicyExtractor#extractRowLevelPolicies и посмотрите что не так.

1 симпатия

Если не получится разобраться то напишите интерфейс на java

1 симпатия

Большое спасибо!

Работает даже без аннотации JvmDefault

Достаточно в build.gradle задать

tasks.withType(org.jetbrains.kotlin.gradle.tasks.KotlinCompile).all {

    kotlinOptions {
        freeCompilerArgs = ["-Xjvm-default=all"]
    }
}

Да. Тут зависит от версии Котлина что вы используете. По моему с версии 1.4 аннотация не обязательна.