Grails 3 spring безопасность Поле идентификатора домена пользователя синтетическое

Я использую Grails 3.2.9 с плагином spring-security-core 3.1.2.

Я запустил сценарий s2-quickstart для создания классов домена User, Role и UserRole. Я обнаружил, что поле id в доменах пользователя и роли считается искусственным. Например, если я запускаю следующий фрагмент кода, поле id не отображается:

def u = User.class.declaredFields.findAll {!it.synthetic}
u.each {
    println it
}

Вот мой пользовательский класс:

@GrailsCompileStatic
@EqualsAndHashCode(includes='username')
@ToString(includes='username', includeNames=true, includePackage=false)
class User extends BaseDomain implements Serializable {

    private static final long serialVersionUID = 1

    String username
    String password
    boolean enabled = true
    boolean accountExpired
    boolean accountLocked
    boolean passwordExpired
    Date lastLogin

    Set<Role> getAuthorities() {
        (UserRole.findAllByUser(this) as List<UserRole>)*.role as Set<Role>
    }

    static constraints = {
        password blank: false, password: true
        username blank: false, unique: true
    }

    static mapping = {
        id generator: 'identity', column: 'user_id', sqlType: 'bigint(20) unsigned'
        password column: '`password`'
        lastLogin sqlType: 'timestamp'
    }
}

Этого не происходит с другими моими доменными классами, и первая проблема, которую я вижу, связана с плагином exa-datatables (2.0.1). Плагин использует аналогичный код для поиска полей домена, поэтому при запросе поля идентификатора для отображения плагином происходит сбой с ошибкой неизвестного столбца.


person MikeM    schedule 10.05.2017    source источник


Ответы (1)


Я обнаружил, что это было вызвано тем, что я расширял класс (BaseDomain в примере) и не помечал BaseDomain как абстрактный. Как только я определил BaseDomain как абстрактный, все заработало, как и ожидалось.

abstract class BaseDomain {...
person MikeM    schedule 11.05.2017