2016-05-27 5 views
0

Я делаю свои первые шаги в Grails (версия 3.1.7), и я делаю приложение, которое требует аутентификации пользователя. Это приложение представляет собой веб-приложение, которое также предоставляет некоторые функции REST, поэтому мне нужен логин в Интернете и логин «отдыха» с токеном.Grails 3.1.7 Spring Security Проблема при создании нового пользователя GORM Scaffolding

Я использую весна-безопасности-ядро: 3.1.0 и весна-безопасности-отдых: 2.0.0.M2 для них предлагают и оба логины работают должным образом.

Теперь у меня возникают проблемы, когда я пытаюсь создать нового пользователя через CRUD, сгенерированный с помощью grails generate-all package.User, я сгенерировал представление должным образом (у меня есть класс клиента, который пользователь мог бы иметь или нет, если у пользователя есть он I предоставить поля клиента в том же разделе создания, потому что клиент может иметь только одного пользователя). Когда я сохранить его я получил внутреннюю ошибку сервера 500:

URI/веб/WebUser/сохранить, классаjava.lang.NullPointerException, сообщениянуля

в файл: \ web \ WebUserController.groovy и строка: webUser.save flush: true

трассировка:

Line | Method 
80 | doFilter in grails.plugin.springsecurity.rest.RestLogoutFilter 
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 
|  64 | doFilter in grails.plugin.springsecurity.web.UpdateRequestContextHolderExceptionTranslationFilter 
|  53 | doFilter in grails.plugin.springsecurity.web.filter.GrailsAnonymousAuthenticationFilter 
| 143 | doFilter in grails.plugin.springsecurity.rest.RestAuthenticationFilter 
|  62 | doFilter in grails.plugin.springsecurity.web.authentication.logout.MutableLogoutFilter 
|  58 | doFilter in grails.plugin.springsecurity.web.SecurityRequestHolderFilter 
| 1145 | runWorker in java.util.concurrent.ThreadPoolExecutor 
| 615 | run  in java.util.concurrent.ThreadPoolExecutor$Worker 
^ 745 | run . . . in java.lang.Thread 

Caused by NullPointerException: null 
->> 47 | $tt__save in WebUserController.groovy 
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 
|  96 | doInTransaction in grails.transaction.GrailsTransactionTemplate$2 
|  93 | execute . in grails.transaction.GrailsTransactionTemplate 
|  96 | doInTransaction in grails.transaction.GrailsTransactionTemplate$2 
|  93 | execute . in grails.transaction.GrailsTransactionTemplate 
|  80 | doFilter in grails.plugin.springsecurity.rest.RestLogoutFilter 
|  64 | doFilter in grails.plugin.springsecurity.web.UpdateRequestContextHolderExceptionTranslationFilter 
|  53 | doFilter in grails.plugin.springsecurity.web.filter.GrailsAnonymousAuthenticationFilter 
| 143 | doFilter in grails.plugin.springsecurity.rest.RestAuthenticationFilter 
|  62 | doFilter in grails.plugin.springsecurity.web.authentication.logout.MutableLogoutFilter 
|  58 | doFilter in grails.plugin.springsecurity.web.SecurityRequestHolderFilter 
| 1145 | runWorker in java.util.concurrent.ThreadPoolExecutor 
| 615 | run . . . in java.util.concurrent.ThreadPoolExecutor$Worker 
^ 745 | run  in java.lang.Thread 

Я не уверен, если у меня есть что-то неправильно в настройках плагина безопасности или в пользовательском и домена клиента класса, или в UserController.

Редактировать: Updete info!

@Transactional (доступен только для чтения = истина)

класс WebUserController {

static allowedMethods = [save: "POST", update: "PUT", delete: "DELETE"] 
static namespace = 'web' 

def springSecurityService 
@Transactional 
def save(WebUser webUser) { 
    if (webUser == null) { 
     transactionStatus.setRollbackOnly() 
     notFound() 
     return 
    } 

    if (webUser.hasErrors()) { 
     transactionStatus.setRollbackOnly() 
     respond webUser.errors, view:'create' 
     return 
    } 

    webUser.save flush:true // line where the NullPointerException is threw 

    if (webUser.isAdmin){ 
     UserRole.create webUser, Role.findByAuthority('ROLE_ADMIN') 
    } else { 
     UserRole.create webUser, Role.findByAuthority('ROLE_CLIENT') 
    } 

    request.withFormat { 
     form multipartForm { 
      flash.message = message(code: 'default.created.message', args: [message(code: 'webUser.label', default: 'WebUser'), webUser.id]) 
      redirect webUser 
     } 
     '*' { respond webUser, [status: CREATED] } 
    } 
} 

И код в Domin:

transient springSecurityService 

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

static transients = ['isAdmin', 'springSecurityService'] 
boolean isAdmin 
Client client 
String name 
String email 
Date lastVisit 
static hasMany = [orders: BOrder] 

static constraints = { 
    username size: 5..15, blank: false, unique: true 
    password size: 5..15, blank: false, password: true 
    email email: true, blank: false, unique: true 
    name size: 0..50, nullable: true 
    lastVisit nullable: true 
    client nullable: true 
} 

ошибка происходит, когда клиент либо нуль или нет , И отладка, если я добавлю afterInsert в классе домена WebUser, я могу увидеть идентификатор клиента, сгенерированный, если он не является нулевым, но идентификатор WebUser не сгенерирован, и я не вижу сообщения об ошибке в этой точке.

+0

Это, вероятно, не имеет ничего общего с безопасностью и является либо проблемой проверки, либо проблемой привязки данных. Не могли бы вы показать код, в котором вы создаете пользователя? –

+0

@BurtBeckwith Я могу показать это в понедельник, потому что теперь я не в офисе. Но большинство из них сгенерировано с помощью команд, Domain с командой s2-quickstart плагина и Контроллером с генерацией grails-all. В домене я добавил «Клиентский клиент» (класс домена, который имеет 2 свойства), и ограничение, которое устанавливает эту ссылку для клиента как обнуляемую. Если этой информации недостаточно, я могу добавить еще код в понедельник! Спасибо за комментарий! –

+0

У вас есть NPE в строке '47 | $ tt__save в WebUserController.groovy' контроллера, что точно в этой строке? Можете ли вы поделиться целым кодом метода, а не только с частью? – droggo

ответ

1

Ну, я нашел, где была проблема.

Проблема заключалась в том, что я добавил ограничение на размер пароля, и проверка была выполнена до того, как пароль был хэширован, поэтому проверка прошла, а затем пароль был хэширован и имеет не менее 15 символов, поэтому он не удался, когда он попытался сохранить пользователя в базе данных, а затем он выбросил исключение нулевого указателя.

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

Единственная странная вещь для меня - это сообщение об ошибке, которое я получил, что, по моему мнению, не показало ничего значимого.