2017-05-08 4 views
1

Ich bin neu in der Verwendung von Spring Security Plug-in für meine Grails App. Hier ist mein Code in den aktuellen Benutzer immer angemeldet.Grails - aktuelle Benutzer weltweit

String username = getPrincipal().username 

Aber die Sache ist Ich schreibe diese Zeile in jeder Aktion den aktuellen Benutzer zu erhalten. Gibt es eine Möglichkeit, den aktuellen Benutzer global zu erhalten? Und benutze es in jeder Aktion, ohne es immer wieder zu deklarieren?

+0

Erstellen Sie eine Klasse mit dem Namen BaseController und machen Sie jeden Controller erweitern Sie dann eine geschützte Methode in es, zugänglich von allen. – Raphael

Antwort

2

Sie können es in zwei Arten tun:
1) Sie können SpringSecurityService injizieren wo immer Sie wollen, einfach in jedem Controller/Service:

SpringSecurityService springSecurityService 

def someMethod(){ 
    springSecurityService.principal 
} 

2) Sie können SecurityContextHolder verwenden:

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

Ich empfehle die Verwendung von Option 1, es macht das Testen einfacher usw.

0

Wenn Sie Benutzerobjekt benötigen, empfehle ich Ihnen, abrufen „frisch“ (aus der DB) Benutzerinstanz vor jeder springSecurityService das injizierte mit:

springSecurityService.principal.username 

Aber wenn Sie nur einen Benutzernamen benötigen - man könnte eine Session-scoped Bean erstellen und mit Benutzernamen an die bevölkern Erstellungszeit:

resources.groovy:

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

Und:

class UserNameHolder { 
    def springSecurityService 

    String username = springSecurityService.principal.username 

    String getUsername() { 
     username 
    } 
} 

Dann sollten Sie benötigt UserNameHolder an die Orte injizieren und den Benutzernamen abzurufen:

class SomeService { 

    def userNameHolder 

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

Viel Spaß!

UPD:

Man könnte fast das gleiche tun, indem Sie Benutzernamen in die Httpsession setzen, aber es wäre viel weniger kontrollierbar und überprüfbar sein. Daher empfehle ich dringend, eine Session-Scoped Bean zu verwenden.

+0

'springSecurityService.currentUser? .userName' Wenn die Eigenschaft' userName' nicht für den Principal verfügbar ist, führt dies einen unnötigen Datenbankaufruf aus. 'springSecurityService.principal.username' wäre besser. –

+0

@JamesKleeh, danke, berücksichtigt;) –

Verwandte Themen