2016-07-20 22 views
0

zeigen, Wie kann ich den Benutzernamen eines Benutzers zeigen, die auf der Kopfzeile jeder Seite angemeldet, ich versuche, die folgenden MethodenWie Sie den Benutzernamen auf jeder Seite mit Spring MVC, Spring Security und Freemarker

1) unter Verwendung von In diesem Frühjahr Sicherheitsetiketten wie folgt aus:

erste erstelle ich eine variable Sicherheits wie diese

<#assign security=JspTaglibs["http://www.springframework.org/security/tags"] /> 

und dann versuche ich den Benutzernamen mit diesem authentication Tag-Methode zu erhalten, die ich

sucht
<@security.authentication property="principal.username"> 

</@security.authentication> 

aber ich bekomme diese Fehlermeldung

FreeMarker template error: 
org.springframework.beans.NotReadablePropertyException: Invalid property 'principal.username' of bean class [org.springframework.security.authentication.UsernamePasswordAuthenticationToken]: Bean property 'principal.username' is not readable or has an invalid getter method: Does the return type of the getter match the parameter type of the setter? 

2) habe ich versucht, den Benutzernamen in den Controllern bekommen und es in der Ansicht setzen wie diese

Authentication auth = SecurityContextHolder.getContext().getAuthentication(); 
String name = auth.getName(); //get logged in username 

    map.addAttribute("username" , name); 

, die gearbeitet, aber ich habe zu viele Controller und ich möchte nicht alle meine Controller aktualisieren und diese Zeilen in alle meine Controller setzen.

das sind meine Versionen

<spring.version>4.2.5.RELEASE</spring.version> 
<spring.security.version>4.1.0.RELEASE</spring.security.version> 

<artifactId>spring-security-taglibs</artifactId> 
<version>4.0.4.RELEASE</version> 

<artifactId>freemarker</artifactId> 
<version>2.3.21</version> 

Jede Lösung willkommen dank

+1

Statt 'principal.username' Verwendung' name' oder 'principal.name'. Die 'Principal' Klasse hat in der Tat keine Eigenschaft' username', sie hat einen Eigenschaftsnamen. (Was wäre leicht zu überprüfen, ob Sie die API von 'Principal 'überprüfen). –

+0

danke, dass das Problem war, habe ich die folgende Zeile verwendet, um den Benutzernamen '<@ security.authentication property =" name "> ' und es funktioniert, danke, , aber ich überprüfte die API und sie Zeige mir dieses Beispiel '' und dieses Beispiel hat nicht funktioniert es zeigte mir Fehler, der meine Frage stellte. Dies ist die API, die ich überprüft habe http://docs.spring.io/spring-security/site/docs/3.0.x/reference/springsecurity-single.html#d0e6333 –

+0

Es hängt nicht mit Ihrem Problem zusammen, aber beachten Sie, dass Sie es sind mit einer ziemlich alten FreeMarker-Version. Das kann Sie kosten, zum Beispiel wegen weniger hilfreicher Fehlermeldungen. – ddekany

Antwort

0

Anscheinend ist der Ausdruck des folgenden Java Anruf bei der Verwendung in Freemarker nicht behoben ist. (Es ist zu lange für mich gewesen, sich an die genaue Syntax zu erinnern).

authentication.getPrincipal().getUsername(); 

Dies ist auch das, was die Ausnahme bei deutet an, dass es nicht die Eigenschaft principal.username Namen finden kann. Schreiben Sie stattdessen einfach name, wodurch die name Eigenschaft des aktuellen Authentication Objekts erhalten wird.

<@security.authentication property="name">