LoginSignup
4
3

More than 3 years have passed since last update.

FreeMarkerでSpring Security JSPタグを使う

Posted at

やりたいこと

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.タグ名 プロパティ名="プロパティ値">

コードの全体像

4
3
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
4
3