Spring Security (Acegi) и группы пользователей (против ролей) - PullRequest
5 голосов
/ 07 июля 2010

Мы разрабатываем приложение (с использованием Grails Spring Security (ранее Acegi)), в котором у нас будут тысячи пользователей, охватывающих 10-15 дискретных типов пользователей. В текущей системе каждый тип пользователя соответствует «группе», а определенные роли и разрешения привязаны к группе. Пользователь получает все свои «роли» из группы.

Например, у нас может быть две группы пользователей:

CLOWN: role = ride_clown_car, toot_horn, receive_applause АКРОБАТ: role = do_flip, walk_tightrope, receive_applause

У нас есть три пользователя, один из которых назначен группе CLOWN, один назначен группе ACROBAT, а другой назначен обоим (имеет объединение ролей CLOWN и ACROBAT).

Если мы меняем права, мы делаем это на уровне группы. Например, если мы добавим разрешение swing_on_trapeze к группе ACROBAT, все акробаты будут автоматически наследовать его.

В терминах Grails разрешения для контроллеров по-прежнему будут на уровне ролей. Таким образом, действие с @Secured (['toot_horn']) позволит пользователям в группе CLOWN, но не в группе ACROBAT. @Secured (['receive_applause']) разрешит и КЛОНЫ, и АКРОБАТЫ.

Как бы я сделал это в Spring Security, учитывая двухуровневый характер модели (пользователь, роль)? Нужно ли мне реализовывать свою собственную аутентификацию для сбора ролей на основе групп?

Спасибо!

1 Ответ

7 голосов
/ 07 июля 2010

Вы должны использовать новый Spring Security Core , поскольку плагин Acegi не разрабатывается и в основном устарел.

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

class User {
   ...
   def getAllRoles() {
      Set allRoles = []
      groups.each { allRoles.addAll it.roles }
      allRoles
   }
}

Это предполагает, что у вас есть много ко многим между пользователем и группой:

static hasMany = [groups: Group]

, и у Group есть многие-ко-многим с ролью:

static hasMany = [roles: Role]

Чтобы использовать это, установите для свойства'lationalAuthorities 'значение' allRoles 'в SecurityConfig.groovy, чтобы оно использовало его вместомногие-ко-многим между пользователем и ролью:

relationalAuthorities='allRoles'

Для основного плагина Spring Security конфигурация не требуется, так как он уже зависит от определенного в приложении метода getAuthorities, поэтому просто используйте что-то подобное в своем Userкласс:

Set<Role> getAuthorities() {
   Set allRoles = []
   groups.each { allRoles.addAll it.roles }
   allRoles
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...