Grails, обновление с Acegi до Spring плагин безопасности - PullRequest
3 голосов
/ 01 июня 2011

Вчера я начал обновлять наше приложение Grails с плагина Acegi 0.5.2 до плагина безопасности Spring.Я сталкиваюсь с несколькими проблемами, может быть, кто-нибудь может помочь здесь?

После внесения необходимых изменений (как задокументировано Берт Беквит на Миграция из плагина Acegi ) я смог начатьприложение Grails еще раз (Woohoo!).Однако вход в систему больше не работал.

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

Это код, который выполняет аутентификацию:

def authenticate(String username, String password) {
try {
      println "Trying authentication with user " + username + " and password " + password + "."
      def tempToken = new UsernamePasswordAuthenticationToken(username, password)
      println "Temptoken is " + tempToken
      def token = authenticationManager.authenticate(new UsernamePasswordAuthenticationToken(username, password))
      println "Authentication token received was: " + token
    } catch (AuthenticationException authenticationException) {
        return false
    }
    return true     
}

Это печатает в журнал:

Trying authentication with user admin and password admin.
Temptoken is org.springframework.security.providers.UsernamePasswordAuthenticationToken@1f: Principal: admin; Password: [PROTECTED]; Authenticated: false; Details: null; Not granted any authorities

И тогда все останавливается.

Классы доменов, которые мы используем, довольно просты.Мы не используем такой класс, как Роль пользователя, для объединения людей и их авторитетов.Вместо этого мы используем сопоставление «многие ко многим», поскольку это всегда работает для нас и легко поддерживается.

Наш класс домена полномочий:

class Authority {
static hasMany = [people: Person]

/** description */
String description
/** ROLE String */
String authority = ''

String authorityType

static constraints = {
    authority(help:'x',class:'wide',blank: false,unique:true)
    description(help:'x',class:'extrawide')
    authorityType(help:'x',class:'wide')
    people(help:'x',selectSort:'username',display:false)
}   

String toString() {
      return authority;
}   
}

И наш класс домена Person:

class Person  {

static hasMany = [authorities: Authority]
static belongsTo = Authority

//Authority primaryGroup

/** Username */
String username
/** User Real Name*/
String userRealName
String familyName
String givenName

/** MD5 Password */
String passwd
/** enabled */
boolean enabled

String email
boolean emailShow

/** description */
String description = ''



static constraints = {
    username(blank: false, unique: true,help:'x',class:'wide')
    userRealName(blank: false,help:'x',class:'wide')
    familyName(blank: false,help:'x',class:'wide')
    givenName(blank: false,help:'x',class:'wide')
    email(help:'x',class:'wide')
    emailShow(help:'x')
    enabled(help:'x')
    passwd(blank: false,password:true,show:false,help:'x',class:'wide')
    authorities(nullable:true,help:'x',sortable:true,selectSort:'authority')        
}

String toString() {
      return username;
  }
}

В Config.Groovy мы определили:

security {
active = false
cacheUsers = false

grails.plugins.springsecurity.providerNames = ['daoAuthenticationProvider', 'anonymousAuthenticationProvider', 'rememberMeAuthenticationProvider']

grails.plugins.springsecurity.userLookUp.userDomainClassName = "Person"
grails.plugins.springsecurity.authority.className = "Authority"

Что касается документации, это должно работать во что бы то ни стало (и так же, как и для «старых»).Настройка Acegi).

Чтобы получить больше информации, я кратко активировал LDAP и обнаружил ту же проблему.WireShark сказал мне, что во время входа в систему не было никаких вызовов LDAP.Я думаю, что либо с кодом в функции Authenticate что-то не так, либо SpringSecurity не знает, как подобрать классы нашего домена.

Я был бы рад прочитать любые идеи!

1 Ответ

0 голосов
/ 01 июня 2011

Кажется, что токен недействителен, поэтому вызов authenticate () завершается неудачно и генерирует исключение (IIRC возвращает значение только в случае успешного вызова).

Моей первой попыткой было бы проверить, есть ли в базе данных строка для пользователя: 'admin', пароль: 'admin' для среды.

После некоторых размышлений я бы перепроверилсвойство пароля в классе Person.Либо через сопоставление в классе домена, либо лучше через

userLookup.passwordPropertyName = "passwd"

ОБНОВЛЕНИЕ: Третье, что нужно проверить.

active = false
...