首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 更多程式語言 >> 程式設計綜合問答

Velocity 模板 `#Authorize("updateState.do")` 語法解析:權限標籤控制鏈接顯示,非 Java 原生語法

     編輯:程式設計綜合問答

代碼背景

片段出自 **Velocity 模板文件 (.vm)**,而非 Java 源碼:

#Authorize("updateState.do")
<a href="javascript:updateStates();" class="But02">修改</a>
#end

語法含義

  • `#Authorize("updateState.do")`:自定義 **Velocity 指令/巨集**,參數 `"updateState.do"` 為權限資源標識(通常對應 Spring Security / Shiro 的 URL 權限)。
  • 邏輯:**當前用戶擁有該權限時,渲染包裹內容(`...`);否則不輸出**。
  • `#end`:關閉指令塊。

後端實現原理 (以 Shiro 為例)

// Velocity 配置
velocityEngine.setProperty("userdirective", "authorize,com.example.velocity.AuthorizeDirective");

// 自定義指令
public class AuthorizeDirective implements Directive {
    @Override
    public void render(InternalContextAdapter context, Writer writer, Node node)
            throws IOException, TemplateException {
        String resource = (String) node.jjtGetChild(0).value(context); // "updateState.do"
        Subject subject = SecurityUtils.getSubject();
        if (subject.isPermitted(resource)) {
            node.render(context, writer); // 輸出包裹內容
        }
        // 無權限則不輸出任何內容
    }
}

對比:JSP/Thymeleaf 同類寫法

模板引擎權限控制標籤
JSP (Shiro Taglib)`...`
Thymeleaf (Spring Security)`修改`
Velocity (自定義)`#Authorize("updateState.do") ... #end`

避坑提醒

  • Velocity 指令區分大小寫:`#Authorize` ≠ `#authorize`,需與註冊名一致。
  • 參數必須加引號:`#Authorize(updateState.do)` 會被解析為變量引用,報錯。
  • 權限判斷邏輯在後端:模板只負責「有權限顯示/無權限隱藏」,**前端隱藏不等於接口安全**,Controller 必須再次校驗 (`@RequiresPermissions` / `@PreAuthorize`)。

認清「Velocity 模板指令 ≠ Java 語法」,權限標籤原理一目瞭然。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved