Grails 3.3 Spring Security, где находится beforeinsert для шифрования пароля? - PullRequest
0 голосов
/ 29 января 2019

Чтобы добавить аутентификацию в приложение Grails 3, добавьте его в build.gradle:

compile 'org.grails.plugins:spring-security-core:3.2.3'

Затем запустите

 grails s2-quickstart com.myapp Operator Role

Это создаст 3 объекта домена, но ничего больше яможет найти.

объект домена оператора выглядит следующим образом:

package com.myapp

importgroovy.transform.EqualsAndHashCode
importgroovy.transform.ToString
importgrails.compiler.GrailsCompileStatic

@GrailsCompileStatic
@EqualsAndHashCode(includes='username')
@ToString(includes='username',includeNames=true,includePackage=false)
classOperatorimplementsSerializable{

privatestaticfinallongserialVersionUID=1

Stringusername
Stringpassword
booleanenabled=true
booleanaccountExpired
booleanaccountLocked
booleanpasswordExpired

Set<Role>getAuthorities(){
(OperatorRole.findAllByOperator(this)asList<OperatorRole>)*.roleasSet<Role>
}

staticconstraints={
passwordnullable:false,blank:false,password:true
usernamenullable:false,blank:false,unique:true
}

staticmapping={
passwordcolumn:'
`password`'
}
}

Проблема в том, что перед шифрованием пароля отсутствует вставка перед вставкой.В Grails 2.5 он помещался в объект домена Operator:

    def beforeInsert() {
            encodePassword()
    }

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

Ответы [ 2 ]

0 голосов
/ 29 января 2019

Еще один вариант кодирования пароля - ввести метод в Application.groovy.

Мой класс UserAccont:

class UserAccount {

  //.. fields 

  def beforeInsert() {
    encodePassword()
  }

  def beforeUpdate() {
    encodePassword()
  }

  String encodePassword() {
    throw new UnsupportedOperationException('Not implemented password encoder!' )
  }
}

Инъекция выглядит следующим образом:

class Application extends GrailsAutoConfiguration {

  @Override
  void doWithDynamicMethods() {
    SpringSecurityService springSecurityService = applicationContext.getBean 'springSecurityService'
    UserAccount.metaClass.encodePassword = {-> 
      delegate.password = springSecurityService.encodePassword delegate.password
    }
  }
}

В этом случае мне не нужно @Autowire обслуживать объекты GORM.В моем приложении я также мог использовать классы домена из другого модуля, основанного на GORM, без зависимости от SpringSec.

0 голосов
/ 29 января 2019

Старый способ позволить доменным классам подвергаться автоматическому подключению и внедрению bean-компонентов в каждый экземпляр доменного класса стоит довольно много памяти.Более поздние версии Grails (3.3.x) выбирают прослушиватель PreInsertEvent для кодирования пароля.Это экономит немного памяти при достижении того же результата.См. Документы s2quicktstart и класс UserPasswordEncoderListener, который был создан в вашем приложении.

https://grails -plugins.github.io / grails-spring-security-core / latest / index.html# учебники

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