2016-05-27 6 views
0

Grails (バージョン3.1.7)で私の最初のステップを実行しています。私はユーザ認証が必要なアプリケーションを実行しています。このアプリは、いくつかのREST機能を提供するWebアプリケーションです。そのため、Webログインとトークンによる「残りのログイン」が必要です。Grails 3.1.7 GORM Scaffoldingによる新しいユーザの作成時のSpringセキュリティの問題

私は春・セキュリティ・コアを使用しています:3.1.0春-セキュリティ残り:2.0.0.M2これらについてを提案し、両方のログインが正常に動作しています。

grails generate-all package.Userで生成されたCRUDを使用して新しいユーザーを作成しようとすると、私はいくつかの問題を抱えています。ビューを正しく生成しました(ユーザーが持つことができるクライアントクラスがあります。クライアントが1人のユーザーのみを持つことができるため、同じ作成セクションにクライアントフィールドを提供してください)。 URI/ウェブ/ WEBUSER/を保存、中メッセージヌル

クラスjava.lang.NullPointerExceptionが

:私はそれを保存すると、私は内部サーバーエラー500を得ましたファイル:\ 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 
} 

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

+0

これはおそらくセキュリティとは関係なく、検証問題またはデータバインディング問題のいずれかです。ユーザーを作成するコードを表示できますか? –

+0

@BurtBeckwith私は月曜日にそれを見ることができます。なぜなら今は私が就職していないからです。しかし、そのほとんどは、コマンド、プラグインのs2-quickstartコマンドを持つドメイン、grails generate-allを持つコントローラで生成されます。ドメインでは、クライアントクライアント(2つのプロパティを持つDomainクラス)と、この参照をnullableとしてクライアントに設定する制限を追加しました。この情報が十分でない場合は、月曜日にさらにコードを追加できます!コメントありがとう! –

+0

'47行目にNPEがあります。 $ tt__save in WebUserController.groovy'コントローラには、その行に正確に何が入っていますか?与えられた部分だけでなく、メソッドコード全体を共有できますか? – droggo

答えて

1

問題がどこにあるのかよく分かりました。

問題は、パスワードサイズに制約を追加し、パスワードがハッシュされる前に検証が実行されたため、検証がパスされ、パスワードがハッシュされ、15文字未満でなく、そのため、ユーザーをデータベースに保持しようとすると失敗し、NULLポインタ例外がスローされました。

パスワードの最大長制限を削除するか変更すると、問題は解決されました。

私にとって唯一奇妙なことは、私が得たエラーメッセージだけです。私の意見では、何も関係がないとは言えませんでした。

関連する問題