2020 年 6 月 3 日

IT Skills 波林

Polin WEI – 資訊工作者的技術手札

Freemarker 在 Spring boot 上的配置並加入 Spring Security Tag

1 min read
野店

Freemarker 在 Spring boot 上的配置並加入 Spring Security Tag: security.tld

Spring Boot 客製化 登入 ( Login ) 與 認證 (Authenticate) 機制 我們有使用 Apache Freemarker 的模版引擎來作網頁,在 Spring Boot 中的套件 ( JAR ) spring-security-taglibs ,有作好的 security tag library 可以加速取得帳號登入的相關資料,並且可以減少用 Apache Freemarker 的程式斷撰寫。 要作的配置如下:

 

  • Gradle 的 build.gradle 在 dependencise 加入下列相依套件

主要加入的有 spring-boot-starter-freemarker, spring-boot-starter-security, spring-security-taglibs, javax.servlet.jsp-api 這4個套件。

dependencies {   
 compile("org.springframework.boot:spring-boot-starter-web")
 compile("org.springframework.boot:spring-boot-starter-freemarker")
 compile("org.springframework.boot:spring-boot-starter-security")
 compile("org.springframework.security:spring-security-taglibs")
 compile("javax.servlet.jsp:javax.servlet.jsp-api:2.3.3")
}

 

  • MvcConfig.java 加入 FreemarkerConfigurer

在 class MvcConfig implements WebMvcConfigurer 中加入 freeMarkerConfigurer()  函數,記得要加入 tlds.add("/META-INF/security.tld"); 這樣才能在 Freemarker 頁面中使用 spring-security-taglibs 定義好的 tag library。

@Configuration
public class MvcConfig implements WebMvcConfigurer {
 
 private final Logger logger = LoggerFactory.getLogger(this.getClass());
 @Autowired
 FreeMarkerConfigurer freeMarkerConfigurer;
 
 public void addViewControllers(ViewControllerRegistry registry) {
  registry.addViewController("/home").setViewName("home");
     registry.addViewController("/").setViewName("home");
     registry.addViewController("/login").setViewName("login");
 }

    /**
     *  
     *    加入 spring-security-taglibs 對 FreeMarker 的支援
     */
    @PostConstruct    
    public void freeMarkerConfigurer() {
        List<String> tlds = new ArrayList<String>();        
        tlds.add("/META-INF/security.tld");
        TaglibFactory taglibFactory = freeMarkerConfigurer.getTaglibFactory();
        taglibFactory.setClasspathTlds(tlds);
        if(taglibFactory.getObjectWrapper() == null) {
            taglibFactory.setObjectWrapper(freeMarkerConfigurer.getConfiguration().getObjectWrapper());
        }
    }
}

 

  • Freemarker 在 HTML 頁面中引用  spring-security-taglibs 定義好的 tag library

在第 1 行匯入 Spring 的 tag library ,而第 2 行則是以用 security 來作為 tag 的標籤代碼,所以在第 11 行時,就可以使用 <@security.authentication property="principal.username" /> 來顯示登入帳號的名稱了。

<#import "/spring.ftl" as spring/>
<#assign security=JspTaglibs["http://www.springframework.org/security/tags"] />
<!DOCTYPE html>
<html>
  <head>
    ...
  </head>
  <body>
    <#if username??>${username}</#if>
    ...
    <@security.authentication property="principal.username" />

  </body>
</html>

 

以上基本的系統網站雛型就完成了

Copyright © All rights reserved. | Newsphere by AF themes.