2017-07-28 6 views
0

です。Grails Spring Security CoreGrails Spring Security REST pluginを使用しています。私はUserクラスとAuthorityクラス(デフォルト)でプラグインを初期化し、guide I found on the Grails websiteの後に統合テストを書くようになりました。grails統合テストで作成された保護されたユーザーは無許可ですが、ブートストラップされたユーザーは

これは、統合テストに次のように置くことを言った:

def "test a user with the role ROLE_BOSS is able to access /api/announcements url"() { 
    when: 'login with the sherlock' 
    RestBuilder rest = new RestBuilder() 
    def resp = rest.post("http://localhost:${serverPort}/api/login") { 
     accept('application/json') 
     contentType('application/json') 
     json { 
      username = 'sherlock' 
      password = 'elementary' 
     } 
    } 

    then: 
    resp.status == 200 
    resp.json.roles.find { it == 'ROLE_BOSS' } 
} 

私は先に行って、類似した何かをしたし、それがブートストラップUserで働いていたが、私はUserとまったく同じテストを行うことをしようとしたときテストメソッド自体で作成された場合、401 HTTP応答コードで失敗します。

私が実行しようとしているコード:

void "check get access token"() { 
    given: 
    RestBuilder rest = new RestBuilder() 
    new User(username: "securitySpecTestUserName", password: "securitySpecTestPassword").save(flush: true) 
    assert User.count == 2 

    when: 
    def resp = rest.post("http://localhost:${serverPort}/api/login") { 
     accept('application/json') 
     contentType('application/json') 
     json { 
      username = "securitySpecTestUserName" 
      password = "securitySpecTestPassword" 
     } 
    } 

    then: 
    resp.status == 200 
} 

ノートが1 UserBootstrap.groovyであり、もう1つは試験方法で作成しますので、User.count == 2主張が通ること。

ブートストラップされたUserを使用すると、この方法で作成されたものの問題は発生しません。このようにしてgrails-spring-security-restプラグインに含まれている/api/loginエンドポイントをテストできるように、この統合テストを書く方法はありますか?

+0

あなたがチェックすることができ、accountLocked、accountExpiredがtrueに設定されていますか? – dynamo

+0

@dynamo残念なことに 'enabled = true'、' accountExpired = false'、 'accountLocked = false'、' passwordExpired = false'は、ブートストラップされたユーザーと同じです。 –

答えて

0

特定のセクションで作成したユーザーは、コミットされていないトランザクション内にあります。 REST呼び出しを実行すると、コミットされていないユーザーが表示されない新しいトランザクションでapi/loginコントローラーが実行されます。

いくつかのオプションが

def init = { servletContext -> 
    environments { 
    test { 
     new User(username: "securitySpecTestUserName", password: "securitySpecTestPassword").save(flush: true) 
    } 
    } 
} 
  • メイクRESTは、ユーザーを作成するために呼び出す

    1. がBootStrap.groovyでユーザーを作成...(他のものがあります) - あなたがこのような機能

      を持っていると仮定
    2. セットアップでユーザーを作成する

      @Integration 
      @Rollback 
      class UserIntSpec extends Specification { 
      
          def setup() { 
          new User(username: "securitySpecTestUserName", password: "securitySpecTestPassword").save(flush: true) 
          } 
      
          void "check get access token"() { 
          given: 
          RestBuilder rest = new RestBuilder() 
      
          when: 
          def response = rest.post("http://localhost:${serverPort}/api/login") { 
           accept('application/json') 
           contentType('application/json') 
           json { 
           username = "securitySpecTestUserName" 
           password = "securitySpecTestPassword" 
           } 
          } 
      
          then: 
          response.status == HttpServletResponse.SC_OK 
      
          when: 
          def token = response.json.access_token 
      
          then: 
          token 
          } 
      } 
      

    注:Grails> = 3.0の場合、setup()は別のトランザクションで実行され、ロールバックされずに保持されます(問題が解決された理由)。すべてのデータを手動でクリーンアップする必要があります。私はあなたがテストでのGrailsのドキュメントを読むことをお勧め

    :ユーザーが有効になっている場合Integration Testing

  • +0

    ありがとうございました!私はドキュメントを徹底的に読んでいましたが、トランザクションがコミットされていないということは、ユーザーがSpring Securityによって認証されないことを意味していることを認識していませんでした。私はそれがデータベースに永続化されていなくても '.save() 'にユーザのために設定されると思っていました。私はコードを 'setup()'メソッドに移しました。これでテストを実行できます。 –

    関連する問題