Страница 1 из 1
Как получить список пользователей имеющих права на объект?
Добавлено: 20 ноя 2006, 15:25
Александр
Может кто уже делал?
Проблема простая...
продолжая скрывать от конечного пользователя
тяжелый интерфейс Лоции нужно либо в действии либо в шаблоне через
функции получить либо
список либо
массив пользователей имеющих права на защищенный объект (при условии что объект находится в зоне видимости пользователя)
Вызов контектстного меню в нашей идеологии не приветствуется.
Нужно - нажал
свою кнопку увидел кто владеет объектом - попросил его дать права и себе. (Просто в действии/шаблоне можно предложить дополнительный сервис по управлению правами)
Сечас вижу только один путь-точнее не вижу ни одного

Как минимально короткими функциями пробежаться по всем юзерам базы и отобрать всех - кто причастен к объекту?

Добавлено: 20 ноя 2006, 19:30
Старик Крупский
Когда работаешь с базой, самый короткий путь - прямой запрос. По id объекта найти его администратора несложно. Вот только зачем, если можно сразу попросить администратора. А еще можно при установке прав сразу записывать в атрибут того, кто имеет полные права, но это концептуально неверно.
Добавлено: 21 ноя 2006, 07:13
Александр
По id объекта найти его администратора несложно
подскажи какой функцией это реализуется? или какой запрос надо построить чтобы вытащить эту информацию?
...ну точно
Круто, спасибо натолкнул на мысль...
Код: Выделить всё
f_ExecSQL...
select
lsdbo.abuser.fio
from lsdbo.abuser
where lsdbo.abuser.empl_id in
((select lsdbo.EmplRight_v.user_id
from lsdbo.EmplRight_v
where lsdbo.EmplRight_v.objid_n='переменная с кодом текущего объекта' and
lsdbo.abuser.empl_id <>0 and
lsdbo.abuser.empl_id is not null))
(никак не перестроюсь на то -что вся инфа-то уже есть где-то в базе)
А не подскажете какая разница между таблицами/представлениями EmplRight и EmplRight_v - окуда правильно брать информацию из _v или без этой самой _v (в таблице .._v просто добавлены 2 даты)
Добавлено: 21 ноя 2006, 11:00
Anderyt
разница в том, что простые пользователи могут просматривать представление, а таблицу - НЕ могут. кроме того, представления не редактируются, хотя в этом я не уверен, не проверял. изменяются только таблицы. поэтому Теххелп настоятельно рекомендует использовать в селектах именно представления (виды). селект, в котором участвуют ТАБЛИЦЫ, а не виды, у простого пользователя НЕ выполнится.
Добавлено: 21 ноя 2006, 11:03
Anderyt
а кстати, каким образом владелец объекта дает права кому либо? тоже наверно через кнопочку и действие, да?

Добавлено: 21 ноя 2006, 11:21
Александр
мысль следующая...
видим объект - нажимаем на кнопку 'Access'
Код: Выделить всё
case (права на объект
when 1- видим 'ничей' (свободный)
then - забирам себе через автосервер
when 2- видим 10 'владельцев'
then - звоним/пишем, просим у одного из них дать права через автосервер или напрямую (наследуемые)
when 3- шеф видит владельцев объекта и говорит
then - нет ребята это все мое - и через автосервер отбирает права у всех давая их себе и выбирая из списка приближенных...
...
и т.д. и т.п.)
End case
Кстати такой вопрос
есть объект созданный кем-то, ему 100 раз переназначили/удалили/добавили права
устория по правам
пустая он или защищен или общедоступен - не важно, главное что в списке прав ни одного юзера и/или администратора..
К объекту, через автосервер, подключаются юзеры, получая привелегии 'GGGG'.
Сам вопрос может ли кто из этих юзеров дать наследуемые права на объект другому (неподключенному к объекту по правам) юзеру
лично/напрямую (не от имени админа) если он не является автором объекта (лицом создавшим его) или все операции присвоения прав на объект не созданный лично -должны проходить от имени админа???
Добавлено: 21 ноя 2006, 11:37
Anderyt
мысль следующая...
видим объект - нажимаем на кнопку 'Access'
1- видим 'ничей' (свободный) - забирам себе через автосервер
2- видим 10 'владельцев' - звоним/пишем, просим у одного из них дать права через автосервер или напрямую (наследуемые)
3- шеф видит владельцев объекта и говорит - нет ребята это все мое - и через автосервер отбирает права у всех давая их себе и выбирая из списка приближенных...
ого... какая мега-система...
кстати, можно процедуру запроса прав у владельца сделать в виде шаблона
Сам вопрос может ли кто из этих юзеров дать наследуемые права на объект другому (неподключенному к объекту по правам) юзеру лично/напрямую (не от имени админа) если он не является автором объекта (лицом создавшим его) или все операции присвоения прав на объект не созданный лично -должны проходить от имени админа???
сможет передать, если у этого юзера (который хочет ДАТЬ права) есть права GGGG. права GGGG как раз и определяют возможность передачи прав (для простого полного доступа достаточно прав вида EEEE).
Добавлено: 21 ноя 2006, 11:47
Александр
Слушай Андрей..
я только смирился с неотвратимостью WorkFlow, а ты уже пугаешь новыми словами
кстати, можно процедуру запроса прав у владельца сделать в виде шаблона
что это? в двух словах плиз, по данному контексту

Добавлено: 21 ноя 2006, 11:57
Anderyt
сорри, не сказал полностью

я как раз имел в виду шаблон работы, то есть шаблон Воркфлоу

думаю, если говорить о "пишет владельцу объекта и просит дать права" - то самое удобное - сделать шаблон.
в этом шаблоне (который, кстати, можно запускать из действия по проверке прав у текущего объекта, если текущий юзер этого захочет) можно устроить пересылку текущего объекта одному из юзеров, у которых есть права передачи прав (можно сделать список только из нескольких конкретных фамилий, если владельцев объекта несколько, чтобы текущий юзер сам выбрал, кто ему больше нравится), и потом, когда выбранный владелец получит сообщение с этим объектом, сделать возможность давать определенные наборы прав в несколько кликов, мощный интерфейс докооборота это позволит сделать, не создавая для этого хранимых процедур

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

Добавлено: 23 ноя 2006, 09:26
Александр
Продолжаем разговор...
А как сделать с помощью SQL запроса назначение прав на существующее/открытое дерево проекта - т.е. включая все дочерние объекты с их дочерними объектами и т.д.
Т.е. у меня есть дерево проекта
Код: Выделить всё
1.Клиент
1.1Контактные лица
1.1.1Контактное лицо 1
1.1.2Контактное лицо 2
...
1.2 Запросы
1.2.1 Запрос 1
1.2.2 Запрос 2
...
Тут возникает 2 вопроса
1- Общая структура была
общедоступна. Далее в разное время разными людьми она наполнялась
общедоступными и
защищенными объектами
Вопрос: как одним запросом (допустим через автосервер) удалить все существующие права на все объекты и отдать их одному пользователю-шефу? Может есть операция - дать права для дерева проекта (включая все внутренности)?
2- Допустим Запрос 1 был защищен и
дополнительно находится(входимость) в объекте План работ юзера1, а запрос 2 соответственно у юзера2, причем из этих объектов есть прямой выход на объект Клиент (через кнопку по ID объекта)
Если шеф забрал права только на объект Клиент не трогая дочерние объекты то юзеры 1 и 2 при попытке открыть родительский объект - получают ошибку Лоции (действие не выполняется - объекта не существует, объект для них стал не видим).
Вопрос: Существует ли простой способ имея в своем распоряжении ID объекта понять доступен ли он для этого юзера или нет? Не анализируя список лиц подключенных к объекту? Есть ли в характеристиках(таблице) объекта такой признак?
Добавлено: 23 ноя 2006, 09:47
Anderyt
ух ты, все интереснее и интереснее
1 Вопрос: как одним запросом (допустим через автосервер) удалить все существующие права на все объекты и отдать их одному пользователю-шефу? Может есть операция - дать права для дерева проекта (включая все внутренности)?
возможно, помогут наследуемые права. но с ними надо аккуратно, они имееют приоретиет над обычными правами и есть еще какие то тонкости с документами архива, на них они тоже наследуются. у меня опыта в этой области нету, мы обходимся без наследуемых прав... а если говорить о простых правах - то проблему можно решить с помощью действия над объектами, которое будет запускаться для каждого объекта, входящего в проект, удалять у него все права, а потом двать нужные... основной вопрос - как получить список ИД объектов, входящих в проект...

возможно, поможет какая то хитрая хранимая процедура...
2 Вопрос: Существует ли простой способ имея в своем распоряжении ID объекта понять доступен ли он для этого юзера или нет? Не анализируя список лиц подключенных к объекту? Есть ли в характеристиках(таблице) объекта такой признак?
но доступность определяется как раз списком прав на текущий объект. если "список прав на объект" есть "список лиц подключенных к объекту", то, скорее всего, не анализируя этот список, доступность не определить...
Добавлено: 23 ноя 2006, 09:59
Александр
Слушай а не поможешь понять следующую весчь, в свое время у техподдержки спрашивал как установить атрибут всем дочерним объектам первого уровня - они дали код
Код: Выделить всё
str_id = Set ( f_execsqlselect ('
SELECT
max (OBJ_REF.id)
FROM LSDBO.attrib_value_view ATR_V,
LSDBO.Value_string_view V_STR,
LSDBO.tree_link_view TREE_LNK,
LSDBO.object_reference_view OBJ_REF
WHERE TREE_LNK.parent_id =' + < переменная с кодом текущего объекта> + ' AND
TREE_LNK.link_type_id = 1 and
OBJ_REF.id = TREE_LNK.link_id AND
OBJ_REF.type_id = <id типа объекта продукта> AND
ATR_V.Attrib_ID = <id атрибута статус> AND
V_STR.Attrib_ID = <id атрибута статус> and
ATR_V.object_id = obj_ref.id AND
V_STR.id = ATR_V.value_id AND V_STR.value <> ~'Исполнен~''
, '', '') )
Какие тут определяющие условия, в плане анализа глубины вложенности
я так понял
TREE_LNK.link_type_id = 1 - определяет первый уровень, а вот как бы сделать запрос на все уровни...? Да и вытащить все дочерние ID.
при условии что длина текста не должна превышать 1600 знаков (столкнулся с этим ограничением в выражении для вычисляемого поля (обещали убрать) но может и здесь то-же самое)
Добавлено: 23 ноя 2006, 10:52
Александр
и еще момент по предыдущему
но доступность определяется как раз списком прав на текущий объект. если "список прав на объект" есть "список лиц подключенных к объекту", то, скорее всего, не анализируя этот список, доступность не определить...
анализ списка юзеров объекта по большому счету бесполезен в данном случае
т.е. я проверяю входит ли текуший пользователь в список и получается
- что если объект открыт - пользователь туда не входит (
ответ не верный т.к. он видит объект и может выйти на него через ID)
- если объект закрыт - то все ок
И собственно как понять, что для него - объект закрыт или открыт, не используя список пользователей, а опираясь на что-то другое?
PS Слушай я тебя от работы не отвлекаю?
Ведь у меня вопросов в запасе миллион 
Добавлено: 23 ноя 2006, 11:09
Александр
все сам нашел object_reference.common_type
'Y'- общедоступный
'P'- защищенный (кстати в документации 'N')
Добавлено: 23 ноя 2006, 11:28
Anderyt
'Y'- общедоступный
'P'- защищенный (стати в документации 'N')
опа... а вот про этот переключатель я как то не подумал даже

и кстати да, если юзер видит объект, то конечно у него есть право на доступ к нему, то есть в списке прав есть его ФИО.. хотя он так же может видеть объект, если входит в группу, которая есть в этом списке прав.....
а вот по поводу определяющего условия все таки скажу
Код: Выделить всё
WHERE
TREE_LNK.parent_id = <Obj_ID>
AND
TREE_LNK.link_type_id = 1
эти условия отбирает те объекты, которые входят в объект с ИД = Obj_ID по типу связи с ИД = 1, а это скорее всего именно дерево проектов.
PS. да нет, не отвлекаете
хотя нужно готовиться к Техникону
...