управление классами, когда все относительно пользователя в nhibernate (orm) - PullRequest
0 голосов
/ 07 декабря 2009

Во-первых, у меня есть три сущности.

Пользователи, роли, элементы

Пользователь может иметь несколько ролей. Элемент назначается на одну или несколько ролей.

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

Теперь есть несколько способов увидеть, как это работает.

  1. Существует коллекция для пользователей, у которой есть роли через ассоциацию «многие ко многим». Тогда каждая роль в этой коллекции будет иметь свою собственную коллекцию предметов. Таким образом, для каждого пользователя мне нужно было бы получить пользователя (используя nhib и извлечь из него роли и элементы), а затем либо выполнить selectMany для элементов в каждой роли, чтобы получить все элементы для пользователя, либо выполнить несколько foreach для переноса. данные для представления или модели.

  2. Создайте триггер БД для автоматической вставки в другую таблицу, которая просто имеет отношения между пользователем и элементами, чтобы в моей сущности «Пользователь» у меня была только коллекция элементов, в которой были назначены все элементы.

  3. Другой способ, о котором я пока не могу думать, потому что я новичок в nHibernate.

Теперь я знаю, что курок не в порядке, но я не уверен, как это сделать. У нас также есть некоторая иерархия позже, когда пользователь может отвечать за группу пользователей. Если бы кто-нибудь мог пролить некоторый свет на то, как они идут по этим сценариям в nhibernate или другой форме, это было бы замечательно, или указывало бы направление.

Я знаю, что раньше вам приходилось вводить все комбинации в таблицу, чтобы запрос работал, но когда вы знаете sql, это не так уж и плохо.

Если вам нужна другая информация, дайте мне знать. Приветствия

Ответы [ 2 ]

1 голос
/ 21 декабря 2009

Логическое отображение: «Пользователь назначен многим ролям» (обратная роль - «Роль имеет много пользователей», если вам действительно нужно отследить это), а «Элемент» виден многим ролям (опять же, обратная связь должна создаваться, только если вам действительно нужно отслеживать что).

Айенде решил эту проблему с Rhino Security. Посмотрите на http://ayende.com/Blog/category/548.aspx всех его постов в блоге. По сути, он использует перехватчик NHibernate для расширения любых запросов информацией о безопасности, что означает, что после настройки разрешений он «просто работает», и вам не нужно беспокоиться о добавлении проблем безопасности в ваши запросы.

Если вы не хотите использовать это для извлечения / отображения всех элементов для данного пользователя, вам нужно выбрать все элементы, которые видны для любой роли, членом которой является пользователь:

  1. Найти все роли, которые имеет текущий пользователь
  2. Найти все элементы, которые содержат список ролей для пользователя

    var roleIds = DetachedCriteria.For .Add (Restrictions.IdEq (currentUser.Id)) .CreateCriteria ("Роли") .SetProjection (Projection.Id);

    var items = session.CreateCriteria () .CreateCriteria ("VisibleTo") .Add (Subqueries.PropertyIn ("Id", roleIds)) .List ();

Написано с макушки головы, поэтому может потребоваться дополнительная настройка.

0 голосов
/ 07 декабря 2009

Взгляните на NhibernateProvider в кодекплексе. Это реализация членства в ASP.Net. Так что у него есть роли, пользователи, приложения. Это может дать вам некоторые идеи о том, как поступить.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...