использовать существующие классы домена с плагином Spring Security - PullRequest
6 голосов
/ 01 августа 2011

Я пытаюсь преобразовать веб-приложение Stripes в Grails. Приложение Stripes использует Spring Security, но я бы хотел, чтобы приложение Grails использовало плагин Spring Security Grails.

В приложении уже есть классы User и Role (Java), которые мне нужно повторно использовать, т. Е. Я не могу использовать классы домена Grails, которые генерирует сценарий s2-quickstart .

Документы плагина Spring Security описывают, как использовать существующий класс домена User. Похоже, шаги:

  1. определяет UserDetails реализацию, которая читает из существующего User класса домена
  2. определяет пользовательскую UserDetailsService реализацию, которая возвращает экземпляры (1)
  3. зарегистрировать экземпляр (2) как bean-компонент Spring с именем userDetailsService.

Однако документы не предоставляют никакой информации о том, как использовать существующий класс Role и класс, представляющий отношение «многие ко многим» между User и Role.

Какие еще шаги необходимы для использования существующих классов Role, User и UserRole с плагином Grails Spring Security? Есть ли какая-то причина, по которой я могу запустить скрипт s2-quickstart , если я не хочу создавать какие-либо доменные классы?

Последующие вопросы к ответу Берта

В конце концов, вам нужен новый GrailsUser

Предположительно GrailsUser здесь относится к пользовательской реализации UserDetails? В моем случае я, вероятно, просто реализую интерфейс напрямую. Кажется ли что-то подобное разумным?

class UserAdapter implements UserDetails {
  private String password  
  private Collection<GrantedAuthority> springRoles

  UserAdapter(User user) {
    this.password = user.password

    Collection<Role> roles = // load legacy Role objects
    this.springRoles = roles.collect { new GrantedAuthorityImpl(it.authority) }
  }      

  // If using password hashing, presumably this is the hashed password?
  String getPassword() {
    password  
  }

  ///////// other UserDetails methods omitted

  Collection<GrantedAuthority> getAuthorities() {
    springRoles
  }
}

Я не храню весь объект User в UserAdapter из-за вашего предупреждения о сохранении потенциально большого объекта в сеансе HTTP.

вам нужно ..... и список экземпляров GrantedAuthority (и идентификатор, если это GrailsUser)

Если я использую свою собственную реализацию UserDetails, как указано выше, то, вероятно, я могу проигнорировать этот комментарий о предоставлении id?

Наконец, если я буду следовать описанному выше подходу, я должен установить эти свойства в Config.groovy и нужно ли мне запускать сценарий s2-quickstart (или любой другой)?

Ответы [ 2 ]

4 голосов
/ 02 августа 2011

Имейте в виду, что Spring Security не заботится о том, откуда поступают данные, ему просто необходим экземпляр UserDetails при аутентификации с помощью поставщика аутентификации DAO, и он может поступать откуда угодно.Удобно использовать доменные классы и таблицы базы данных, но это всего лишь один подход.Делайте то, что работает для ваших данных.В конце концов, вам нужен новый экземпляр GrailsUser (или некоторый другой импл) с набором username и password, набором 3 логических значений и списком экземпляров GrantedAuthorityid).если это GrailsUser).

Самое простое, что нужно сделать, если у вас есть устаревшие данные о пользователях и ролях, - это создать пользовательский UserDetailsService.Используйте GORM, необработанные SQL-запросы, все, что вам нужно, чтобы получить необходимые данные.

Другой вариант - написать свой AuthenticationProvider, как Глен сделал здесь: http://blogs.bytecode.com.au/glen/2010/01/15/hacking-custom-authentication-providers-with-grails-spring-security.html - хотя это более масштабное решение, котороетакже включает в себя пользовательский фильтр, который вам не нужен.Поставщик DAO использует UserDetailsService, но неплохо создать свой собственный, который объединит функциональность в один класс.

Хотя не стоит повторно использовать ваш класс домена User как UserDetails.Даже если вы реализуете интерфейс, вы будете хранить в сеансе HTTP отключенный потенциально большой (если есть присоединенные коллекции) объект.Реализации POJO / POGO (класс User Spring Security, класс GrailsUser плагина и т. Д.) Очень малы и содержат всего несколько строк и логических значений.

1 голос
/ 02 августа 2011

в файле config.groovy вы должны указать классы вашего домена, которые вы хотите использовать:

grails.plugins.springsecurity.userLookup.userDomainClassName = 'your.package.User'
grails.plugins.springsecurity.userLookup.authorityJoinClassName = 'your.package.UserRole'
grails.plugins.springsecurity.authority.className = 'your.package.Role'

я думаю, что не обязательно внедрять собственную службу userDetail, потому что весенняя защита использует

SpringSecurityUtils.securityConfig.userLookup

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

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