如何将 Thymeleaf SpringSecurityDialect 添加到 spring 启动

How do I add Thymeleaf SpringSecurityDialect to spring boot

在我的模板引擎配置中,我想添加 SpringSecurityDialect(),例如:

@Bean
public TemplateEngine templateEngine() {
    SpringTemplateEngine engine = new SpringTemplateEngine();
    engine.addDialect(new SpringSecurityDialect());
    engine.setEnableSpringELCompiler(true);
    engine.setTemplateResolver(templateResolver());
    return engine;
}

然而 eclipse 告诉我:

The type org.thymeleaf.dialect.IExpressionEnhancingDialect cannot be resolved. It is indirectly referenced from required .class files

这是什么意思,我该如何解决?

pom.xml我有:

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

这意味着 org.thymeleaf.extras:thymeleaf-extras-springsecurity4org.thymeleaf:thymeleaf 有依赖性,正如您在上面的 repo 的 link 中看到的那样。显然你没有提供这种依赖。 class IExpressionEnhancingDialect 在那里。您可以通过将依赖项添加到您的项目来解决该问题。

因为这可能会有点复杂......我也在玩 Spring 引导,spring 安全和 thymeleaf 的安全方言(加上 spring 数据h2).这是我的 gradle 依赖项供参考,它们可能会以某种方式帮助您:

ext['thymeleaf.version'] = '3.0.1.RELEASE'
ext['thymeleaf-layout-dialect.version'] = '2.0.0'

dependencies {
    compile("org.springframework.boot:spring-boot-devtools")
    compile("org.springframework.boot:spring-boot-starter-web")
    compile("org.springframework.boot:spring-boot-starter-thymeleaf")
    compile("org.springframework.boot:spring-boot-starter-data-jpa")
    compile("org.springframework.boot:spring-boot-starter-security")
    compile("org.thymeleaf.extras:thymeleaf-extras-springsecurity4:3.0.1.RELEASE")

    compile("com.h2database:h2")
}

请注意,我想使用 thymeleaf 3 而不是 2,这就是为什么我的配置中有一些额外的令人不快的调整。

编辑: thymeleaf-extras-springsecurity4 的版本应与其他答案中建议的 thymeleaf.version 相同。

正如@Lachezar 已经回答的那样,您必须添加那些缺少的依赖项。但是 ext['thymeleaf.version'] = '3.0.0.RELEASE 的指定版本应该与编译依赖项中的相同,所以你最好使用 ext['thymeleaf.version'] = '3.0.1.RELEASE'.

此外,请注意,只需为安全方言指定一个 bean 即可,而无需为模板引擎提供 bean。在类路径上使用 Thymeleaf,它会自动识别该 bean 是 IDialect 的实例并将其直接添加到方言中:

@Bean
public SpringSecurityDialect springSecurityDialect() {
    return new SpringSecurityDialect();
}