2014-09-11 4 views
0

Привет всем Я пишу программу, которая должна запросить установку документа, чтобы вернуть список в шкафы или папки, у меня есть запрос, который возвращает объекты в папке только отлично но у меня возникают проблемы возвращающихся видимые шкафов корневого или домашнего кабинета, я пытаюсь сказать что-то вродеdocumentum dql return cabinets, где r_accessor_permit> 2

select object_name from dm_cabinet where r_accessor_name = 'user' and r_accessor_permit >2 

поэтому в основном я хочу, чтобы вернуть объекты в ом шкафе для данного пользователя, но возвращать только те, которые этот пользователь имеет разрешение 3 или выше. есть ли способ сделать это?

есть способ объединения двух таблиц для ACL и dm_cabinet

ответ

2

Есть несколько способов сделать это, либо с DQL или с DFC (Java). Какой бы подход вы ни выбрали, я бы рекомендовал использовать сеанс, принадлежащий фактическому пользователю, для которого вы пытаетесь получить доступ к шкафам/папкам. Я бы не использовал суперпользователя (который мог бы обойти модель безопасности Documentum).

Если вы все равно кодируете это на Java, самым гибким решением является использование DFC или, возможно, комбинация DFC и DQL. Как только вы получите IDfSysobject (кабинет, папка или документ), вы можете использовать метод getPermit(), который даст вам int, который вам нужен. Обязательно протестируйте этот int против статических целых чисел в интерфейсе IDfACL - избегайте магических чисел.

Например, поместите нужные объекты в список.

// assuming you have an initialized user session (not covered here) 
IDfSession userSession; 

List<String> readableCabinetsNames = new ArrayList<String>(); 

// will only return objects that the current user can see (browse or higher) 
String dql = "SELECT r_object_id FROM dm_cabinet"; 

IDfQuery query = new DfQuery(dql); 
IDfCollection coll = query.execute(userSession, IDfQuery.DF_READ_QUERY); 
while (coll.next()) { 
    IDfCabinet cabinet = (IDfCabinet) coll.getTypedObject(); 
    if (cabinet.getPermit() >= IDfACL.DF_PERMIT_READ) { 
     String cabinetName = cabinet.getObjectName(); 
     readableCabinetsNames.add(cabinetName); 
    } 
} 

Это просто что-то из моей памяти, чтобы вы начали, и он может быть улучшен - много :)

Помните: Оба DQL и DFC будут следовать моделям безопасности Documentum. Пользователь никогда не увидит объект, для которого у него нет прав.

+0

Есть ли способ сделать это в .net ... select r_object_id вернет больше объектов, чем показания DA с тем же именем пользователя, по крайней мере, на моем конце. –

+1

Причина, по которой DA возвращает меньше шкафов, заключается в том, что DA считывает и интерпретирует атрибут 'is_private' из' dm_cabinet', и поэтому он скрывает эти шкафы от представления. Если вы также хотите скрыть эти шкафы, добавьте 'AND is_private = 0' в ваше предложение WHERE. – eivamu

+0

Я предполагаю, что мой вопрос был неправильным, когда я запускаю базовый выбор из dm_cabinet, он возвращает все шкафы, включая пользовательские, я не хочу включать шкафы других пользователей. Я могу видеть персональные кабинеты Джеймса и Криса и Лизы, хотя я вошел в систему как ryan –

2

dm_cabinet является подтипом dm_folder. Это может вам помочь. Если вы можете подключиться к репозиторию Documentum с указанными учетными данными пользователя, вам просто нужно получить объекты без какого-либо фильтра, может ли этот пользователь видеть его, поскольку Documetnum уважает права пользователей относительно объектов так, как вы пытаетесь их извлечь.

Если вы не можете установить это соединение, вам потребуется некоторая специальная кодировка. Если это так, я уточню свой ответ.

+0

Я предполагаю, что мой вопрос был неправильным, когда я запускаю базовый выбор из dm_cabinet, он возвращает все шкафы, включая пользовательские, я не хочу включать шкафы других пользователей. Я могу видеть персональные кабинеты Джеймса и Криса и Лизы, хотя я вошел в систему как Райан –

 Смежные вопросы

  • Нет связанных вопросов^_^