Гость
Форумы / Caché, Ensemble, DeepSee, MiniM, IRIS, GT.M [игнор отключен] [закрыт для гостей] / Используем безопасность на уровне строк таблиц (Row-level Security) / 7 сообщений из 7, страница 1 из 1
01.08.2008, 15:54
    #35465954
VadimF
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Используем безопасность на уровне строк таблиц (Row-level Security)
В версии Caché 2007.1 появилась возможность управлять в SQL безопасностью на уровне строк таблиц (Row-level Security).

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

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

1. Создайте класс Test.RowLevelSecurity
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
Class Test.RowLevelSecurity Extends (%Persistent, %Populate)
{
Property Name As %String(POPSPEC = "Name()");
Property DOB As %Date;

Parameter ROWLEVELSECURITY = 1;

ClassMethod %SecurityPolicy(Name) As %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 и не работает при прямом или объектном доступе.


Вадим
...
Рейтинг: 0 / 0
03.08.2008, 01:46
    #35467127
Бред
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Используем безопасность на уровне строк таблиц (Row-level Security)
VadimF,

С одной стороны, говорится о трех способах доступа к одним и тем же данным. С другой, по нескольким причинам, и теперь к ним добавилась еще одна, в конкретном "приложении" приходится использовать один способ доступа): Например, если вашему "приложению" нужна "безопасность на уровне строк", то нельзя использовать объектный доступ, так как он "рассекретит данные"):
Нельзя ли как-то ясно изложить мнение IS? И в целом, и по каждому аспекту неравнозначности доступов): Считают ли, например, в IS, что "безопасность на уровне объекта класса" невозможна?):
...
Рейтинг: 0 / 0
04.08.2008, 15:52
    #35469222
VadimF
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Используем безопасность на уровне строк таблиц (Row-level Security)
БредС одной стороны, говорится о трех способах доступа к одним и тем же данным. С другой, по нескольким причинам, и теперь к ним добавилась еще одна, в конкретном "приложении" приходится использовать один способ доступа): Например, если вашему "приложению" нужна "безопасность на уровне строк", то нельзя использовать объектный доступ, так как он "рассекретит данные"):В Cache' за счет использования единой архитектуры данных для выборки данных используется SQL.
Сценарий, который используется крайне часто, - выборка данных с помощью SQL, затем работа с каждым объектом, используя объектный подход.
Например при создании Web-приложения на ZEN такой подход можно применять.

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

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

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

Using Caché’s Security Features
...
Рейтинг: 0 / 0
04.08.2008, 19:37
    #35469748
Бред
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Используем безопасность на уровне строк таблиц (Row-level Security)
VadimF,

Спасибо.
...
Рейтинг: 0 / 0
06.08.2008, 14:58
    #35473947
mys
mys
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Используем безопасность на уровне строк таблиц (Row-level Security)
Есть такой класс с роу-секьюрити:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
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(acclvl) As %String [ SqlProc ]
{
 i (acclvl=0) q "role0"
 i (acclvl=1) q "role1,role0"
 i (acclvl=2) q "role2,role1,role0"
 q ""
}
}
Роу секьюрити работает замечательно. Есть класс связанный с классом указанным выше отношением один ко многим. Возможно ли сделать проверку роу секьюрити у второго класса как указано ниже? Если да, то как. У меня не получилось.
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
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(root) As %String [ SqlProc ]
{
 i (root.acclvl=0) q "role0"
 i (root.acclvl=1) q "role1,role0"
 i (root.acclvl=2) q "role2,role1,role0"
 q ""
}
}
...
Рейтинг: 0 / 0
25.08.2008, 10:58
    #35504014
servit
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Используем безопасность на уровне строк таблиц (Row-level Security)
mysРоу секьюрити работает замечательно. Есть класс связанный с классом указанным выше отношением один ко многим. Возможно ли сделать проверку роу секьюрити у второго класса как указано ниже? Если да, то как. У меня не получилось.Можно. Например, так:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
ClassMethod %SecurityPolicy(root) As %String [ SqlProc ]
{
 s acclvl=##class(test.root).%OpenId(root).acclvl
 q:acclvl=0 "role0"
 q:acclvl=1 "role1,role0"
 q:acclvl=2 "role2,role1,role0"
 q ""
}
...
Рейтинг: 0 / 0
Период между сообщениями больше года.
19.12.2016, 15:35
    #39370297
servit
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Используем безопасность на уровне строк таблиц (Row-level Security)
...
Рейтинг: 0 / 0
Форумы / Caché, Ensemble, DeepSee, MiniM, IRIS, GT.M [игнор отключен] [закрыт для гостей] / Используем безопасность на уровне строк таблиц (Row-level Security) / 7 сообщений из 7, страница 1 из 1
Целевая тема:
Создать новую тему:
Автор:
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]