0

私は Grails (バージョン 3.1.7)で最初のステップを実行しており、ユーザー認証が必要なアプリケーションを実行しています。このアプリは、いくつかの REST 機能も提供する Web アプリケーションであるため、Web ログインと、トークンを使用した "rest" ログインが必要です。

これらの提案にspring-security-core:3.1.0spring-security-rest:2.0.0.M2を使用しており、両方のログインが正常に機能しています。

で生成された CRUD を介して新しいユーザーを作成しようとすると、いくつかの問題がgrails generate-all package.User発生します。適切にビューを生成しました (ユーザーが持っているかどうかに関係なくクライアント クラスを持っているので、ユーザーが持っている場合はクライアント フィールドを提供しますクライアントはユーザーを 1 人しか持てないため、同じ create セクションも必要です)。保存すると、内部サーバー エラー 500 が発生しました。

URI /web/webUser/saveクラス java.lang.NullPointerExceptionメッセージ null

ファイル内: \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 に問題があるかどうかはわかりません。

追記:情報更新!

@Transactional(readOnly = true)

クラス 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] }
    }
}

そしてドミンのコード:

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
}

エラーは、クライアントが null かそうでない場合に発生します。また、WebUser ドメイン クラスに afterInsert を追加してデバッグすると、クライアント ID が null でない場合は生成されますが、WebUser ID は生成されず、その時点でエラー メッセージは表示されません。

4

1 に答える 1