如何使用 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:authentication
或 sec: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();
}
我正在为我的应用程序使用 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:authentication
或 sec: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();
}