17645


Grails 3.0.8をインストールして , create-appして, Spring-Security-core plugin
3.0.0.M1の公式[tutorials](http://grails-plugins.github.io/grails-spring-security-
core/guide/tutorials.html)の手順通り設定しました。

しかし、うまくいきません。  
公式手順通りID"me"、パスワード"password"のアドミン権限でログインしても、トップディレクトリが権限エラーで表示できません。

どうすれば、トップディレクトリを権限エラー無しで表示できるのでしょうか？最終的にはアドミン権限をもってないユーザもトップディレクトリを表示できるようにしたいです。

※開発環境のトップディレクトリ = <http://localhost:8080>

ちなみに、具体的には以下の手順で設定しました。  
1\. create-app

[code]

        $ grails create-app testApp profile=web
        $ cd testApp
    
[/code]

  2. build.gradleに設定追加
[code]     dependencies {

       …
       compile 'org.grails.plugins:spring-security-core:3.0.0.M1'
       …
    }
    
[/code]

compileコマンド実行

[code]

        $ grails 
        grails> compile
        grails> exit
    
[/code]

  3. User と Role のdomain classesを作成（interactive mode）
[code]     $ grails

    grails> s2-quickstart common User Role
    
[/code]

  4. grails-app/init/BootStrap.groovy にtest User追加
[code]     import common.testapp.Role

    import common.testapp.User
    import common.testapp.UserRole
    class BootStrap {
    
       def init = { servletContext ->
    
          def adminRole = new Role('ROLE_ADMIN').save()
          def userRole = new Role('ROLE_USER').save()
    
          def testUser = new User('me', 'password').save()
    
          UserRole.create testUser, adminRole, true
    
       }
    }
    
[/code]

  5. サーバ起動（interactive mode).
[code]     grails> run-app

    
[/code]

  6. [http://localhost:8080にアクセス](http://localhost:8080%E3%81%AB%E3%82%A2%E3%82%AF%E3%82%BB%E3%82%B9)

  7. ID"me"、パスワード"password"を入力してログイン

権限エラーメッセージが表示されます。

[code]     指定されたページへのアクセスは許可されていません。

    
[/code]

Note:

application.groovyを記載しますが、一切変更していません.

[code]

        // Added by the Spring Security Core plugin:
        grails.plugin.springsecurity.userLookup.userDomainClassName = 'common.User'
        grails.plugin.springsecurity.userLookup.authorityJoinClassName = 'common.UserRole'
        grails.plugin.springsecurity.authority.className = 'common.Role'
        grails.plugin.springsecurity.controllerAnnotations.staticRules = [
            '/':                ['permitAll'],
            '/error':           ['permitAll'],
            '/index':           ['permitAll'],
            '/index.gsp':       ['permitAll'],
            '/shutdown':        ['permitAll'],
            '/assets/**':       ['permitAll'],
            '/**/js/**':        ['permitAll'],
            '/**/css/**':       ['permitAll'],
            '/**/images/**':    ['permitAll'],
            '/**/favicon.ico':  ['permitAll']
        ]
    
[/code]


CC BY-SA 3.0
2015-10-13T13:22:05.443
17604
2015-10-14T12:06:53.443
2015-10-14T12:06:53.443
7277
7277
question
spring grails
Grails3.0.8でSpring Security Core pluginを設定するとトップディレクトリで権限エラーになってしまう


私の環境でもチュートリアル通りに実施しても確かに動作ませんでした。  
そこで、SpringSecurityCoreの認証方式を変更することで動作させることができることを確認しました。

まず、テスト用に、以下のコントローラを作成します。（アノテーションは必要ありません。）

[code]

    class HelloworldController {
    
        // /helloworld/indexで誰でもアクセスできる。
        def index() {
            render "Hello world!?"
        }
    
        // /helloworld/index2でアクセス。ログイン必須。
        def index2() {
            render "index2"
        }
    
        // /helloworld/adminでアクセス。ログイン済みかつadminロールが必要。
        def admin() {
            render "this is admin only"
        }
    
        // /helloworld/userでアクセス。ログイン済みかつuserロールが必要。
        def user() {
            render "this is user only"
        }
    }
    
[/code]

上記テスト用のユーザを登録します。（BootStrap.groovy）

[code]

    import common.Role
    import common.User
    import common.UserRole
    
    class BootStrap {
    
        def init = { servletContext ->
    
            def adminRole = new Role('ROLE_ADMIN').save()
            def userRole = new Role('ROLE_USER').save()
    
            def admin = new User('admin', 'password').save()
            def user = new User('user', 'password').save()
    
            UserRole.create admin, adminRole, true
            UserRole.create user, userRole, true
        }
        def destroy = {
        }
    }
    
[/code]

そして、SpringSecurityCoreの設定をapplication.groovyに記述します。  
**既に追記されている既存のSpringSecurityCoreの設定はコメントアウト or 削除してください。**  
**userDomainClassName** 、 **authorityJoinClassName** 、 **className**
の設定は環境に合わせて修正してください。

[code]

    // Added by the Spring Security Core plugin:
    grails.plugin.springsecurity.userLookup.userDomainClassName = 'common.User'
    grails.plugin.springsecurity.userLookup.authorityJoinClassName = 'common.UserRole'
    grails.plugin.springsecurity.authority.className = 'common.Role'
    
    grails.plugin.springsecurity.logout.postOnly = false
    grails.plugin.springsecurity.auth.loginFormUrl = '/login/auth'
    grails.plugin.springsecurity.failureHandler.defaultFailureUrl = '/login/authfail?login_error=1'
    
    grails.plugin.springsecurity.securityConfigType = "InterceptUrlMap"
    grails.plugin.springsecurity.interceptUrlMap = [
        '/':                     ['permitAll'],
        '/login/auth':           ['permitAll'],
        '/logout/index':         ['isAuthenticated()'],
        '/helloworld/index':     ['permitAll'],
        '/helloworld/index2':    ['isAuthenticated()'],
        '/helloworld/admin':     ['ROLE_ADMIN'],
        '/helloworld/user':      ['ROLE_USER'],
        '/assets/**':            ['permitAll'],
        '/**/js/**':             ['permitAll'],
        '/**/css/**':            ['permitAll'],
        '/**/images/**':         ['permitAll'],
        '/**/favicon.ico':       ['permitAll'],
    ]
    
[/code]

この状態で、念の為Grailsを停止、インタラクティブモードから抜けた後に、再度Grailsを起動すれば意図通りの動作になると思います。

  * **/** でトップページにアクセスできるようになっているはずです。
  * Helloworldコントトーラのコメントにあるアクションメソッドにそれぞれアクセスすれば動作を確認できるはずです。
  * **/logout/index** でログアウト出来るようになっているはずです。

今回の修正は、コントローラやアクション毎にアノテーションで認証方法を設定するのではなくて、URL単位で認証する方法に変えた形です。  
やり方が悪いのかどうなのか判然としませんが、チュートリアルと同じように勧めても確かに動作しないし、アクションメソッド毎にアノテーションをセットしてもちゃんと動いていない（コントローラ内で最初に指定したアノテーションがそのコントローラの全てのアクションメソッドに適用されているっぽい）です。

あと注意点なのですが、私の環境だけなのかもしれませんが、ログインした直後は必ず **/favicon.ico** にリダイレクトされてしまっています。  
この対応方法はまだわかりません。  
もし意図しないタイミングで認証エラーページが表示された場合は、一度URLを確認してみてください。  
**/favicon.ico** にリダイレクトされている可能性が有ります。


CC BY-SA 3.0
2015-10-14T09:52:36.480
17645
2015-10-14T09:52:36.480
12777
17604
answer