2017-05-08 6 views
1

Grailsアプリケーション用のSpring Securityプラグインの新機能です。ここに私のコードはgrails - 現在のユーザーをグローバルに取得する

。現在ログインしているユーザーを取得してい
String username = getPrincipal().username 

しかし、事は、私は、現在のユーザーを取得するために、すべてのアクションには、この行を書いています。現在のユーザーをグローバルに取得する方法はありますか?それを何度も何度も宣言することなく、あらゆる行動に使用しますか?あなたは、単に任意のコントローラ/サービスで、どこにでもしたいSpringSecurityServiceを注入することができます
1):

+0

BaseControllerという名前のクラスを作成し、すべてのコントローラーがそのクラスを拡張してから、すべてからアクセス可能な保護されたメソッドを作成します。 – Raphael

答えて

2

あなたは2通りの方法でそれを行うことができます

SpringSecurityService springSecurityService 

def someMethod(){ 
    springSecurityService.principal 
} 

2)あなたはSecurityContextHolderを使用することができます。

def someMethod(){ 
    SecurityContextHolder.context.authentication?.principal 
} 

オプション1を使用することをお勧めします。テストが楽になります。

0

ユーザーオブジェクトを取得する必要がある場合は、 「新鮮な」取得springSecurityService前に注入されたを使用してユーザーインスタンスごとに(DBから撮影):

springSecurityService.principal.username 

しかし、あなたは唯一のユーザ名が必要な場合 - あなたはセッションスコープのBeanを作成して、で、ユーザー名とそれを埋めることができ作成時間:

resources.groovy

... 
userNameHolder(UserNameHolder) { bean -> 
    bean.scope = 'session' 
    springSecurityService = ref("springSecurityService") 
} 
... 

そして:

class UserNameHolder { 
    def springSecurityService 

    String username = springSecurityService.principal.username 

    String getUsername() { 
     username 
    } 
} 

次に、あなたが必要な場所へUserNameHolderを注入し、ユーザー名を取得する必要があります。

class SomeService { 

    def userNameHolder 

    void someMethod() { 
     ... 
     userNameHolder.username 
     ... 
    } 
    ... 
} 

をお楽しみください!

UPD

あなたはたHTTPSessionにユーザー名を置くことによって、ほぼ同じことを行うことができますが、それははるかに少ないcontrolableとテスト可能になります。したがって、セッションスコープのBeanを使用することを強くお勧めします。

+0

'springSecurityService.currentUser?.userName'プリンシパルで' userName'プロパティが利用できない限り、これは不要なデータベース呼び出しを行います。 'springSecurityService.principal.username'が良いでしょう。 –

+0

@JamesKleeh、ありがとう、考慮した;) –

関連する問題