2017-03-28 11 views
0

Grails 3.2.8のコントローラからspringSecurityService.currentUserを取得できません。Grails 3.2.8コントローラでspringSecurityService.currentUserを取得できません

Grails 3.2.8では、Spring Security Coreを破棄しているような以前のバージョンでは改善されていなかった点に注意してください。 Grails 3.2.8 dependency injection in domain classesによると、私はgrails.gorm.autowire = trueを設定し、その不一致を修正しました。再現する

ステップ:

  1. ロールおよびグループを使用して春のセキュリティ3.1.1を使用して新しいGrailsの3.2.8 Webアプリケーションを作成します。ブートストラップでapplication.ymlで

  2. 、設定grails.gorm.autowire =真

  3. def init = { servletContext -> 
        User user = new User(username: 'foo', password:'foo').save(flush: true) 
        Role role = new Role(authority: 'SomeRole').save(flush: true) 
        RoleGroup roleGroup = new RoleGroup(name: 'SomeRole').save(flush: true) 
        RoleGroupRole.create(roleGroup, role) 
        UserRoleGroup.create(user, roleGroup) 
    } 
    
  4. は、コントローラTestController作成:

    @Secured(['SomeRole']) 
    class TestController { 
        def springSecurityService 
    
        def index() { 
         println "springSecurityService==null? ${(springSecurityService==null).toString()}" 
         println "SecurityContextHolder.context==null? ${(SecurityContextHolder.context==null).toString()}" 
         println "SecurityContextHolder.context?.authentication==null? ${(SecurityContextHolder.context?.authentication==null).toString()}" 
         println "springSecurityService.principal==null? ${(springSecurityService.principal==null).toString()}" 
         println "springSecurityService.currentUser==null? ${(springSecurityService.currentUser==null).toString()}" 
    
         render "1" //Render something so we don't get an exception. 
        } 
    } 
    
  5. が起動しサーバーに接続し、/ testに移動します。出力は次のとおりです。

    springSecurityService==null? false 
    SecurityContextHolder.context==null? false 
    SecurityContextHolder.context?.authentication==null? true 
    springSecurityService.principal==null? true 
    springSecurityService.currentUser==null? true` 
    

が良い回避策はありますか?

答えて

0

SecurityContextHolder.contextがnullではない(それはnullになることはありません)が、 SecurityContextHolder.context?.authenticationがnullの場合、これはおそらく、Grailsのか、プラグインの問題ではありません - あなたは、認証されていません。したがって、キャッシュされたユーザーIDを取得するためのプリンシパルがありません(つまり、出力が示すようにspringSecurityService.principalがnullです)。現在のユーザーインスタンスを取得する方法はありません。

0

解決済み。バージョン3.2.8以降、このデフォルト設定はapplication.yml:grails.gorm.autowire = falseです。あなたはそれをtrueに設定しなければならず、そしてサービスはいつものようにautowireになります。

関連する問題