2013-08-19 11 views
16

Ho un progetto Spring + Thymeleaf con il seguente codice di vista.sec: authorize e sec: le annotazioni di autenticazione non funzionano

<!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> 

Il sec: autorizzazione e sec: gli attributi di autenticazione non funzionano come previsto - il div è sempre mostrato, anche se nessun utente è connesso, e l'arco si legge sempre "Miquel".

Segue uno snippet pertinente dalla mia classe controller.

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

      return "home"; 
    } 

La dichiarazione println funziona come previsto - se nessun utente è connesso, esso stampa "AnonymousUser", altrimenti il ​​nome utente.

Cosa sto sbagliando?

+0

Possibile soluzione: http://stackoverflow.com/questions/32904857/secauthorize-returning-true-for-both-isauthenticated-and -manonymous-in-your/40492335 # 40492335 – bpgriner

risposta

20

Dopo aver confrontato la mia applicazione da vicino con l'applicazione di prova Thymeleaf & Spring Security, ho scoperto la fonte dell'errore.

Apparentemente, per consentire a Thymeleaf di elaborare gli attributi sec:authorize e sec:authentication, è necessario registrare SpringSecurityDialect come un dialetto aggiuntivo del bean motore del modello.

<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> 

Questo è sorprendente, in quanto non v'è alcuna menzione di questo fatto sulla the related Thymeleaf documentation page. Spero che questo aiuti gli altri che dovranno affrontare lo stesso problema in futuro.

+2

Uomo, grazie! –

+1

Inoltre, non dimenticare di includere la dipendenza da 'thymeleaf-extras-springsecurity3' come ho fatto io –

5

Per la versione Java di configurazione, ha funzionato anche per me aggiungendo il dialetto di sicurezza a molla:

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

yup! l'aggiunta del dialetto ha funzionato anche per me. –

0

Inoltre, si potrebbe desiderare di cancellare la cache del modello dopo un evento di autenticazione, in modo che il modello è ri- elaborato con nuovi dati di autenticazione. Oppure, impostare i modelli sensibili a una sessione di accesso su non memorizzati nella cache (questo è ciò che ho fatto), utilizzando ServletContextTemplateResolver.setNonCacheablePatterns().

13

Nella primavera del Boot ho dovuto aggiungere il seguente dipendenza:

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

Questo ha funzionato per me senza configurare il bean SpringTemplateEngine. Sto usando Spring boot 1.4.1.RELEASE e il plugin di gestione delle dipendenze Spring 0.5.1.RELEASE – Yasin

Problemi correlati