Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Caché Новый топик    Ответить
 Используем безопасность на уровне строк таблиц (Row-level Security)  [new]
VadimF
Member

Откуда: InterSystems Russia
Сообщений: 512
В версии Caché 2007.1 появилась возможность управлять в SQL безопасностью на уровне строк таблиц (Row-level Security).

Это реализуется следующим образом: появляется системный столбец, который содержит список ролей и/или пользователей, которые имеют доступ к каждой строке таблицы. Когда выполняется запрос пользователь должен иметь хотя бы одну роль, для того чтобы увидеть строку. Как правило, список ролей вычисляется на основании данных таблицы и при изменениях строки автоматически вычисляется новый список ролей. За счет индексирования системного столбца безопасность на уровне строк таблиц лишь незначительно уменьшает производительность SQL.

Вот небольшой пример:

1. Создайте класс Test.RowLevelSecurity
Class Test.RowLevelSecurity Extends (%Persistent%Populate)
{
Property Name As %String(POPSPEC "Name()");
Property DOB As %Date;

Parameter ROWLEVELSECURITY = 1;

ClassMethod %SecurityPolicy(NameAs %String SqlProc ]
{
 
if $e(Name,1)="S" {quit "Vadim,_SYSTEM"else {quit "Vadim"}
}
}
2. Создайте пользователя Vadim с правами работать через SQL.
3. Сгенерируйте тестовые данные: Do ##class(Test.RowLevelSecurity).Populate(1000)
4. Зайдите в портал управления под пользователем Vadim и выполните SQL-запросы:

select * from Test.RowLevelSecurity
select count(*from Test.RowLevelSecurity

Вы должны увидеть все 1000 строк, которые Вы сгенерировали.
5. Зайдите в портал управления под пользователем _System и выполните SQL-запросы:

select * from Test.RowLevelSecurity
select count(*from Test.RowLevelSecurity

Вы должны увидеть только строки, которые начинаются на “S” и получить количество таких строк.

Есть возможность использовать безопасность на уровне строк таблиц и для существующих таблиц.
Подробности в документации.

Обратите внимание, что безопасность на уровне строк таблиц работает только на уровне SQL и не работает при прямом или объектном доступе.


Вадим
1 авг 08, 15:54    [6017031]     Ответить | Цитировать Сообщить модератору
 Re: Используем безопасность на уровне строк таблиц (Row-level Security)  [new]
Бред
Guest
VadimF,

С одной стороны, говорится о трех способах доступа к одним и тем же данным. С другой, по нескольким причинам, и теперь к ним добавилась еще одна, в конкретном "приложении" приходится использовать один способ доступа): Например, если вашему "приложению" нужна "безопасность на уровне строк", то нельзя использовать объектный доступ, так как он "рассекретит данные"):
Нельзя ли как-то ясно изложить мнение IS? И в целом, и по каждому аспекту неравнозначности доступов): Считают ли, например, в IS, что "безопасность на уровне объекта класса" невозможна?):
3 авг 08, 01:46    [6020150]     Ответить | Цитировать Сообщить модератору
 Re: Используем безопасность на уровне строк таблиц (Row-level Security)  [new]
VadimF
Member

Откуда: InterSystems Russia
Сообщений: 512
Бред
С одной стороны, говорится о трех способах доступа к одним и тем же данным. С другой, по нескольким причинам, и теперь к ним добавилась еще одна, в конкретном "приложении" приходится использовать один способ доступа): Например, если вашему "приложению" нужна "безопасность на уровне строк", то нельзя использовать объектный доступ, так как он "рассекретит данные"):
В Cache' за счет использования единой архитектуры данных для выборки данных используется SQL.
Сценарий, который используется крайне часто, - выборка данных с помощью SQL, затем работа с каждым объектом, используя объектный подход.
Например при создании Web-приложения на ZEN такой подход можно применять.

Безопасность на уровне строк таблиц упростит создания собственной модели безопасности на уровне приложения при таком подходе.
Бред
Нельзя ли как-то ясно изложить мнение IS? И в целом, и по каждому аспекту неравнозначности доступов): Считают ли, например, в IS, что "безопасность на уровне объекта класса" невозможна?):
Многие партнеры-разработчики (например, ДВ-Софт или SolidWorks) реализовали подобные механизмы в своих приложениях и могут управлять доступом на уровне объектов, используя уникальные для своих приложений алгоритмы.

Вы задаете очень интересный вопрос, но так как он лишен конкретики, на него сложно ответить.
Доступы к данным в Cache' разные и обладают разными свойствами. В разных случаях имеет смысл применять ту или иную комбинацию.

Не готов формулировать позицию InterSystems по Вашему глобальному вопросу.
Посмотрите презентации на тему безопасности на Devcon 2008:

Using Caché’s Security Features
4 авг 08, 15:52    [6024431]     Ответить | Цитировать Сообщить модератору
 Re: Используем безопасность на уровне строк таблиц (Row-level Security)  [new]
Бред
Guest
VadimF,

Спасибо.
4 авг 08, 19:37    [6025742]     Ответить | Цитировать Сообщить модератору
 Re: Используем безопасность на уровне строк таблиц (Row-level Security)  [new]
mys
Member

Откуда:
Сообщений: 53
Есть такой класс с роу-секьюрити:
Class test.root Extends %Persistent
{

Property name As %String Required ];

Property acclvl As %Integer Required ];

Relationship list As test.list Cardinality = many, Inverse = root ];

Parameter ROWLEVELSECURITY = 1;

ClassMethod %SecurityPolicy(acclvlAs %String SqlProc ]
{
 
(acclvl=0) "role0"
 
(acclvl=1) "role1,role0"
 
(acclvl=2) "role2,role1,role0"
 
""
}
}
Роу секьюрити работает замечательно. Есть класс связанный с классом указанным выше отношением один ко многим. Возможно ли сделать проверку роу секьюрити у второго класса как указано ниже? Если да, то как. У меня не получилось.
Class test.list Extends %Persistent
{

Relationship root As test.root Cardinality = one, Inverse = list ];

Index rootIndex On root;

Property name As %String Required ];

Parameter ROWLEVELSECURITY = 1;

ClassMethod %SecurityPolicy(rootAs %String SqlProc ]
{
 
(root.acclvl=0) "role0"
 
(root.acclvl=1) "role1,role0"
 
(root.acclvl=2) "role2,role1,role0"
 
""
}
}
6 авг 08, 14:58    [6034410]     Ответить | Цитировать Сообщить модератору
 Re: Используем безопасность на уровне строк таблиц (Row-level Security)  [new]
servit
Member

Откуда: г. Кишинёв, Республика Молдова
Сообщений: 3075
Блог
mys
Роу секьюрити работает замечательно. Есть класс связанный с классом указанным выше отношением один ко многим. Возможно ли сделать проверку роу секьюрити у второго класса как указано ниже? Если да, то как. У меня не получилось.
Можно. Например, так:
ClassMethod %SecurityPolicy(rootAs %String SqlProc ]
{
 
acclvl=##class(test.root).%OpenId(root).acclvl
 q
:acclvl=0 "role0"
 
q:acclvl=1 "role1,role0"
 
q:acclvl=2 "role2,role1,role0"
 
""
}
25 авг 08, 10:58    [6104162]     Ответить | Цитировать Сообщить модератору
Между сообщениями интервал более 1 года.
 Re: Используем безопасность на уровне строк таблиц (Row-level Security)  [new]
servit
Member

Откуда: г. Кишинёв, Республика Молдова
Сообщений: 3075
Блог
Динамическая безопасность на уровне строк (row level security)
19 дек 16, 15:35    [20022707]     Ответить | Цитировать Сообщить модератору
Все форумы / Caché Ответить