やりたいこと
FreeMarker上で、 <security:authorize>
などのJSPタグを使いたい。https://vorba.ch/2018/spring-boot-freemarker-security-jsp-taglib.html で紹介されていたことを、自分でも確認したい。
FreeMarkerには元々、JSPタグを使う機能があるらしい。→ 参考URL
環境
- AdoptOpenJDK 11.0.5
- Spring Boot 2.2.2.RELEASE
- Spring Security 5.2.1.RELEASE
- Embedded Tomcat 9.0.29
- FreeMarker 2.3.29
依存性
pom.xml
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-freemarker</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-security</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.security</groupId>
<artifactId>spring-security-taglibs</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.apache.tomcat</groupId>
<artifactId>tomcat-jsp-api</artifactId>
</dependency>
</dependencies>
Spring SecurityのJSPタグ( spring-security-taglibs
)およびJSP API( tomcat-jsp-api
)が必要なのがポイント。
Java Configクラス
SecurityConfig.java
@Configuration
public class MyFreeMarkerConfig {
private final FreeMarkerConfigurer freeMarkerConfigurer;
public MyFreeMarkerConfig(FreeMarkerConfigurer freeMarkerConfigurer) {
this.freeMarkerConfigurer = freeMarkerConfigurer;
}
@PostConstruct
public void init() {
freeMarkerConfigurer.getTaglibFactory().setClasspathTlds(
Collections.singletonList("/META-INF/security.tld"));
}
}
TLDファイルのパスを指定するのがポイント。
画面の書き方
index.ftlh
<#assign security=JspTaglibs["http://www.springframework.org/security/tags"]/>
<html>
<head>
<title>Index</title>
<meta charset="UTF-8">
</head>
<body>
<h1>Index</h1>
<@security.authorize access="isAuthenticated()">
<p>Hello, <@security.authentication property="principal.username"/>!</p>
</@security.authorize>
<p><a href="/secret">Go to secret page</a></p>
<form action="/logout" method="post">
<input type="submit" value="Logout">
<input type="hidden" name="${_csrf.parameterName}" value="${_csrf.token}" />
</form>
</body>
</html>
<#assign security=JspTaglibs["http://www.springframework.org/security/tags"]/>
でJSPタグを指定する。
タグを使う時は <@security.タグ名 プロパティ名="プロパティ値">
。