2011-06-20 24 views
7

Spring Security Coreプラグインがインストールされていて、うまく動作している単純なGrailsアプリがあります。ただし、セキュリティコンテキストでログインしているユーザーの権限を更新することで、この問題に対する解決策は見つかりませんでした。現在のユーザーの詳細(springSecurityService.reauthenticateなど)の更新に関することではありません。Grails Spring Securityプラグイン - ログインしたユーザの権限を変更する

私の問題は次のとおりです。ROLE_ADMINとROLE_USER権限を使用する単純なユーザー管理アプリケーションがあります。今では、2台の管理者が異なるコンピュータから同時に(ROLE_ADMIN権限で)ログインし、1人の管理者が他の管理者の権限をROLE_ADMINからROLE_USERに変更することを決定しました。

変更されたユーザー(新しいROLE_USERロールを持つユーザー)がROLE_ADMINレベルのアクションを実行できないように、そしてすぐにROLE_USERレベルのページにリダイレクトされるように、ユーザーとロールを更新できますか?ログインしているユーザーの権限が変更されたかどうかにかかわらず、すべてのコントローラのアクションで追加のチェックを行う必要がないように、セキュリティコンテキストを更新する方法はありますか?どういうわけか、cahceUsersプロパティを使用できますか?私はcacheUsersを変更していないと私の理解では、デフォルトではfalseです。私が間違っているなら、私を修正してください。

はEDIT:コード 問題を引き起こしているシーケンスが

  1. 管理者 "" 管理者 "B" を変更し、管理者のための新たな役割(ROLE_USER)を設定し、 "B"

  2. PersonRole.removeAll(personInstanceB) and PersonRole.create(personInstanceB, roleAdmin)を呼び出し、すべてが正常に更新されます。

  3. 同時に、管理者 "B"は権限が変更されたときにすでにログインしています。管理者 "B"は、ログアウトして新しいログインを行うまでROLE_ADMIN制限付きページで作業を続けることができます。権限が更新され、管理者 "B"に新しい役割(ROLE_USER)が割り当てられました

  4. ユーザーが新しい役割で更新されたときに管理者 "B"をROLE_USERページにリダイレクトする/ login

  5. springSecurityService.reauthenticate personInstanceB.username)を呼び出すと、管理者 "A"が管理者 "B"として「ログイン」し、これが機能しなくなります。

アイデアは大歓迎です。私はここで単純なものを見逃しているかもしれませんが、私はその解決策が何であるか分かりません。

乾杯、これはテストされていませんが、それはあなたのコントローラ/サービスクラスで

試してみる

答えて

11

mizzzto、今たくさん明確である

... 

User user = User.get(springSecurityService.principal.id) //get the user 
Role adminRole = //get or create the admin Role 
UserRole.remove user, role // remove admin Role 

Role userRole = // get or create the user Role 
UserRole.create user, role //add the user Role 

... 

if (!user.hasErrors() && user.save(flush: true)) { 
    springSecurityService.reauthenticate user.username // refresh the users security deatils 
} 

.... 

EDIT

私が頭の上からやることは、ユーザー切り替え機能を使用することです。あなたはあなたがこのpriviledgeのための新たな役割を(例えばROLE_SWITCH_USER)にすることをお勧めされてtrue

  • useSwitchUserFilter属性を設定Switch User

    • ファーストを参照してください。どこかにあなたの管理ページで
    • 、あなたは以下の adminToUser()方法(例えば)への呼び出しを行うことによって
    • 変更役割の設定を自分のユーザー名を使用して編集したいユーザーで

      <sec:ifAllGranted roles='ROLE_SWITCH_USER'> 
          <form action='/j_spring_security_switch_user' method='POST'> 
           Switch to user: <input type='text' name='j_username'/> <br/> 
           <input type='submit' value='Switch'/> 
          </form> 
      </sec:ifAllGranted> 
      
    • ログ
    • 元のユーザーに戻す
    • 完了しました。

    - あなたはコード形式にuserInstanceを取り、管理者から利用者へのthier役割を変更し、あなたのコントローラやサービスのメソッドを作成するための最初の答えを使用することができます。

    def adminToUser(user, adminRole, userRole){ 
        UserRole.remove user, adminRole 
        UserRole.create user, userRole 
        if (!user.hasErrors() && user.save(flush: true)) { 
         springSecurityService.reauthenticate user.username 
        } 
    } 
    
  • +0

    こんにちは、返信に感謝を。私の質問を投稿する前に、あなたが説明したように私はすでにやっていました。しかし、これは、あなたが管理者で、別の管理者の権限を更新する場合 - >次にspringSecurityService.reauthenticate user.usernameを呼び出すと、変更されたユーザーの資格情報でセッションが更新されることを意味します。つまり、変更したユーザーとして「ログイン」しただけです。私はそれを望んでいない:)私は後で私はそれをより明確にするために自分の投稿を編集します。 – mizzzto

    +0

    @mizzzto編集を参照してください! – gotomanners

    +0

    おかげさまで、今とてもうまくいっているようですので、シンプルでしかも非常に強力です! :)しかし、実際には、ユーザーがログインしている間に権限が変更されたことを変更されたユーザーに通知する簡単な方法があるはずです。私はこれの一番下に行く必要があります:) – mizzzto

    6

    は、私は二回再認証することにより、この問題を解決した:

    保存他のユーザーに降格された管理者の名前:

    def originalUserName = springSecurityService.principal.name 
    springSecurityService.reauthenticate user.username 
    springSecurityService.reauthenticate originalUserName 
    
    関連する問題