Плагин Grails spring-security-core ожидает столбец имени пользователя в таблице ролей - PullRequest
0 голосов
/ 26 января 2011

У меня действительно странная проблема. Я установил spring-security-core 1.0.1 в свое приложение Grails 1.3.6 и настроил его в соответствии с руководством - таблицы создаются в порядке и заполняются BootStrap.groovy. Я использую базу данных PostgreSQL 8.4 - все работает на моем локальном хосте. Теперь загрузчик работает отлично, но когда я пытаюсь войти, я получаю исключение, которое говорит

org.hibernate.exception.SQLGrammarException: could not execute query

и далее вниз:

Caused by: org.postgresql.util.PSQLException: ERROR: Column »username« does not exist

Сбой запроса следующий:

select
    authrole0_.id as id1_,
    authrole0_.version as version1_,
    authrole0_.authority as authority1_ 
from
    auth_role authrole0_ 
where
    username=?

и это нормально, потому что в таблице auth_role не должно быть столбца с именем пользователя. Но почему Hibernate ожидает столбец имени пользователя, где он не должен быть?

Любые подсказки, как решить эту проблему?

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

Мои занятия выглядят так:

class AuthUser {

    String username
    String password
    boolean active
    boolean accountExpired
    boolean accountLocked
    boolean passwordExpired

    static mapping = {
        cache true
        username column: '`username`'
        password column: '`password`'
    }

    Set<AuthRole> getAuthorities() {
        UserRole.findAllByUser(this).collect { it.role } as Set
    }
}

import java.util.Set;

class AuthRole {

String authority

static constraints = {
    authority blank: false, unique: true
}
  }

  import org.apache.commons.lang.builder.HashCodeBuilder

class UserRole implements Serializable {

    AuthRole role
    AuthUser user

    boolean equals(other) {
        if (!(other instanceof UserRole)) {
            return false
        }

        other.user?.id == user?.id &&
                other.role?.id == role?.id
    }

    int hashCode() {
        def builder = new HashCodeBuilder()
        if (role) builder.append(role.id)
        if (user) builder.append(user.id)
        builder.toHashCode()
    }

    static UserRole get(long roleId, long userId) {
        find 'from UserRole where role.id=:roleId and user.id=:userId',
                [roleId: roleId, userId: userId]
    }

    static UserRole create(AuthRole role, AuthUser user, boolean flush = false) {
        new UserRole(role: role, user: user).save(flush: flush, insert: true)
    }

    static boolean remove(AuthRole role, AuthUser user, boolean flush = false) {
        UserRole instance = UserRole.findByRoleAndUser(role, user)
        instance ? instance.delete(flush: flush) : false
    }

    static void removeAll(AuthRole role) {
        executeUpdate 'DELETE FROM UserRole WHERE role=:role', [role: role]
    }

    static void removeAll(AuthUser user) {
        executeUpdate 'DELETE FROM UserRole WHERE user=:user', [user: user]
    }

    static mapping = {
        id composite: ['user', 'role']
        version false
    }
}

Они очень похожи на то, как их создал плагин.

Спасибо, аль

1 Ответ

0 голосов
/ 26 января 2011

ОК, нашел его - «включено» - это значение по умолчанию. В моем классе я определил «активный» вместо «включен».

Кажется, что плагин действительно обидчив, когда дело доходит до настройки ;-)

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