Я делаю свои первые шаги в 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 не сгенерирован, и я не вижу сообщения об ошибке в этой точке.
Это, вероятно, не имеет ничего общего с безопасностью и является либо проблемой проверки, либо проблемой привязки данных. Не могли бы вы показать код, в котором вы создаете пользователя? –
@BurtBeckwith Я могу показать это в понедельник, потому что теперь я не в офисе. Но большинство из них сгенерировано с помощью команд, Domain с командой s2-quickstart плагина и Контроллером с генерацией grails-all. В домене я добавил «Клиентский клиент» (класс домена, который имеет 2 свойства), и ограничение, которое устанавливает эту ссылку для клиента как обнуляемую. Если этой информации недостаточно, я могу добавить еще код в понедельник! Спасибо за комментарий! –
У вас есть NPE в строке '47 | $ tt__save в WebUserController.groovy' контроллера, что точно в этой строке? Можете ли вы поделиться целым кодом метода, а не только с частью? – droggo