2013-08-19 4 views
16

Ich habe ein Spring + Thymeleaf-Projekt mit dem folgenden View-Code.sec: authorize und sec: Authentifizierungsanmerkungen funktionieren nicht

<!DOCTYPE html SYSTEM "http://www.thymeleaf.org/dtd/xhtml1-strict-thymeleaf-spring3-3.dtd"> 
    <html 
      xmlns="http://www.w3.org/1999/xhtml" 
      xmlns:th="http://www.thymeleaf.org" 
      xmlns:sec="http://www.thymeleaf.org/thymeleaf-extras-springsecurity3"> 

      <head> 
        <title>Contacts</title> 
        <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" /> 
      </head> 
      <body> 
        <div id="content"> 
          <h1>Welcome to the site!</h1> 

          <p th:if="${loginError}">Wrong user or password</p> 
          <form th:action="@{/j_spring_security_check}" method="post"> 
            <label for="j_username">Email address</label>: 
            <input type="text" id="j_username" name="j_username" /> <br /> 
            <label for="j_password">Password</label>: 
            <input type="password" id="j_password" name="j_password" /> <br /> 
            <input type="submit" value="Log in" /> 
          </form> 
        </div> 

        <div sec:authorize="isAuthenticated()"> 
          User: <span sec:authentication="name">miquel</span> 
        </div> 
      </body> 
    </html> 

Die sec: autorisieren und sec: Authentifizierung Attribute wie erwartet funktionieren nicht - das div wird immer angezeigt, auch wenn kein Benutzer angemeldet ist, und die Spanne liest immer „Miquel“.

Folgt einem relevanten Ausschnitt aus meiner Controller-Klasse.

@RequestMapping(value = "/welcome.html") 
    public String wellcome() 
    { 
      Authentication auth = SecurityContextHolder.getContext().getAuthentication(); 
      System.out.println("username: " + auth.getName()); 

      return "home"; 
    } 

Die println Anweisung funktioniert wie erwartet - wenn kein Benutzer angemeldet ist, druckt es „AnonymousUser“, sonst den Benutzernamen.

Was mache ich falsch?

+0

Mögliche Lösung: http://stackoverflow.com/questions/32904857/secauthorize-returning-true-for-both-isauthenticated-and -isanonymous-in-thy/40492335 # 40492335 – bpgriner

Antwort

20

Nachdem ich meine Anwendung eng mit der Thymeleaf & Spring Security Demoanwendung verglichen hatte, entdeckte ich die Fehlerquelle.

Offenbar, damit Thymeleaf die sec:authorize und sec:authentication Attribute verarbeiten kann, müssen Sie SpringSecurityDialect als zusätzlichen Dialekt der Vorlage Engine Bean registrieren.

<bean id="templateEngine" class="org.thymeleaf.spring3.SpringTemplateEngine"> 
    <property name="templateResolver" ref="templateResolver" /> 
    <property name="additionalDialects"> 
     <set> 
      <bean class="org.thymeleaf.extras.springsecurity3.dialect.SpringSecurityDialect" /> 
     </set> 
    </property> 
</bean> 

Dies ist überraschend, da es keine Erwähnung dieser Tatsache auf the related Thymeleaf documentation page ist. Ich hoffe, dies hilft anderen, die in Zukunft mit dem gleichen Problem konfrontiert werden.

+2

Mann, danke! –

+1

Vergessen Sie auch nicht, die 'thymeleaf-extras-springsecurity3' maven Abhängigkeit wie ich –

5

für die Java-Config-Version, es funktionierte für mich auch durch die Federsicherheits Dialekt hinzu:

@Bean 
public SpringTemplateEngine templateEngine() { 
    SpringTemplateEngine templateEngine = new SpringTemplateEngine(); 
    templateEngine.setTemplateResolver(templateResolver()); 
    templateEngine.addDialect(new TilesDialect()); 
    templateEngine.addDialect(new SpringSecurityDialect()); 
    return templateEngine; 
} 
+0

yup! das Hinzufügen von Dialekt hat auch für mich funktioniert. –

0

Auch können Sie möchten die Template-Cache nach einem Authentifizierungsereignis löschen, so dass Ihre Vorlage Wieder- ist verarbeitet mit neuen Authentifizierungsdaten. Oder setzen Sie die Vorlagen, die für eine Anmeldesitzung sensibel sind, auf nicht zwischengespeicherte (das ist, was ich getan habe), mit ServletContextTemplateResolver.setNonCacheablePatterns().

13

Im Frühjahr Stiefel Ich hatte gerade die folgende Abhängigkeit hinzuzufügen:

<dependency> 
     <groupId>org.thymeleaf.extras</groupId> 
     <artifactId>thymeleaf-extras-springsecurity4</artifactId> 
    </dependency> 
+1

Dies funktionierte für mich, ohne die SpringTemplateEngine Bean zu konfigurieren. Ich benutze Spring Boot 1.4.1.RELEASE und Spring Abhängigkeitsverwaltung Plugin 0.5.1.RELEASE – Yasin

Verwandte Themen