如何使用 Thymeleaf 配置 Spring Boot 并使用 sec:authentication 标签

How can I configure SpringBoot with Thymeleaf and use sec:authentication tag

我正在为我的应用程序使用 spring-boot 1.2.5 + thymeleaf + spring 安全性。

我需要在我的网站上显示用户名,经过一些研究我似乎应该使用类似这样的代码:

<div sec:authentication="name">The value of the "name" property of
        the authentication object should appear here.</div>

但是我没有让 Thymeleaf 解析该标签。我需要一些帮助:(

您需要在项目中添加 Spring Security 3 集成模块。这些模块是 Thymeleaf 方言,相当于 Spring 安全标签库。这些是 thymeleaf 额外模块,不是 Thymeleaf 核心的一部分。

在您的模板引擎中只需添加集成模块方言。

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

添加模块后,您可以使用以下代码:

<div sec:authentication="name">The value of the "name" property of
    the authentication object should appear here.</div>

可以找到 Thymeleaf 等效模块 here。 另外,参考这个 Step by Step tutorial of TheymeLeaf

更新:

如果你使用Spring启动,你只需要在pom.xml中添加依赖或者在你的项目中添加jar。

如果您正在使用 Spring Boot 并且您想要使用 sec:authenticationsec:authorize,请不要忘记在您的 pom.xml

<dependency>
    <groupId>org.thymeleaf.extras</groupId>
    <artifactId>thymeleaf-extras-springsecurity3</artifactId>
</dependency>

你必须做三件事:

注册组件:

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

添加百里香安全定义

    <!DOCTYPE html>
<html xmlns="http://www.w3.org/1999/xhtml"
    xmlns:th="http://www.thymeleaf.org"
    xmlns:sec="http://www.thymeleaf.org/thymeleaf-extras-springsecurity4">

最后添加到您的 gradle 存储库:

compile("org.thymeleaf:thymeleaf-spring4")
compile("org.thymeleaf.extras:thymeleaf-extras-springsecurity4")

我也遇到了 xmlns:sec 的问题。我花了很多时间来完成这项工作。在我意识到问题是注册新方言之后,我尝试注册它们但对我没有任何帮助。 最后,在我从互联网上收集了一些代码之后 sec:authorize="hasRole('USER') 开始工作了。 我做了一个结合了 Maven 依赖项的简单项目。它是 spring 引导 + thymeleaf + spring 安全。

我有 spring 引导(不是 spring 3 或 4)+ thymeleaf + spring 安全性,所有这些都可以正常工作。 配置基于 java,而不是 xml。

Link 到项目 https://github.com/hackofi/springboot-sec

pom.xml

<parent>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-parent</artifactId>
    <version>1.4.2.RELEASE</version>
</parent>

<dependencies>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-thymeleaf</artifactId>
    </dependency>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-security</artifactId>
    </dependency>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-test</artifactId>
        <scope>test</scope>
    </dependency>
    <dependency>
        <groupId>org.springframework.security</groupId>
        <artifactId>spring-security-test</artifactId>
        <scope>test</scope>
    </dependency>
    <dependency>
        <groupId>org.thymeleaf.extras</groupId>
        <artifactId>thymeleaf-extras-springsecurity4</artifactId>
        <version>2.1.2.RELEASE</version>
    </dependency>
</dependencies>

<properties>
    <java.version>1.8</java.version>
</properties>


<build>
    <plugins>
        <plugin>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-maven-plugin</artifactId>
        </plugin>
    </plugins>
</build>

WebConfig.java

@Configuration
@EnableWebMvc
@EnableConfigurationProperties
@ComponentScan(basePackages = "cz.vse")
public class WebConfig extends WebMvcConfigurerAdapter {

    @Autowired
    private Environment environment;

    @Override
    public void addResourceHandlers(ResourceHandlerRegistry registry) {
        registry.addResourceHandler("/static/**").addResourceLocations("/static/");
    }


    @Bean
    public TemplateResolver templateResolver() {
        ServletContextTemplateResolver templateResolver = new ServletContextTemplateResolver();
        templateResolver.setPrefix("/WEB-INF/views/");
        templateResolver.setSuffix(".html");
        templateResolver.setTemplateMode("HTML5");
        return templateResolver;
    }
    @Bean
    public SpringTemplateEngine templateEngine(TemplateResolver templateResolver) {
        SpringTemplateEngine templateEngine = new SpringTemplateEngine();
        templateEngine.setTemplateResolver(templateResolver);
        templateEngine.addDialect(new SpringSecurityDialect());
        return templateEngine;
    }
    @Bean
    public SpringTemplateEngine templateEngine() {
        SpringTemplateEngine templateEngine = new SpringTemplateEngine();
        templateEngine.setTemplateResolver(templateResolver());
        return templateEngine;
    }

    @Bean
    public ViewResolver viewResolver() {
        ThymeleafViewResolver viewResolver = new ThymeleafViewResolver();
        viewResolver.setTemplateEngine(templateEngine());
        viewResolver.setOrder(1);
        return viewResolver;
    }
}

WebSecurityConfig.java

@Configuration
@EnableWebSecurity
public class WebSecurityConfig extends WebSecurityConfigurerAdapter {
    @Override
    protected void configure(HttpSecurity http) throws Exception {
        http
                .authorizeRequests()
                .antMatchers("/", "/home").permitAll()
                .anyRequest().authenticated()
                .and()
                .formLogin()
                .loginPage("/login")
                .permitAll()
                .and()
                .logout()
                .permitAll();
    }

    @Autowired
    public void configureGlobal(AuthenticationManagerBuilder auth) throws Exception {
        auth
                .inMemoryAuthentication()
                .withUser("user").password("pass").roles("USER").and()
                .withUser("derp").password("pass").roles("ADMIN");
    }
}

在Spring Boot中,除了添加编译依赖外:

compile 'org.thymeleaf.extras:thymeleaf-extras-springsecurity3:'2.1.3.RELEASE'

我不得不为方言添加一个豆子:

@Bean
IDialect springSecurityDialect() {
    new SpringSecurityDialect()
}

只有这样 Spring Boot 的自动配置才会通过询问所有 IDialect bean 的上下文来选择方言:

public ThymeleafDefaultConfiguration(
        Collection<ITemplateResolver> templateResolvers,
        ObjectProvider<Collection<IDialect>> dialectsProvider) {
    this.templateResolvers = templateResolvers;
    this.dialects = dialectsProvider.getIfAvailable();
}