jetbrick-template-1.x 旧版文档请看这里:http://subchen.github.io/jetbrick-template/1x/

§安全管理器 SecurityManager

由于 jetbrick-template 支持在模板中直接调用 Java 类和方法,在一些特殊的项目中(如CMS),如果允许用户上传自己的模板,那样就会涉及到安全性问题。

考虑到这种情况,jetbrick-template 引入了自己的安全管理器。

§1. 安全管理器能做什么

§2. 如何启用安全管理器

安全管理器和 ResourceLoader 绑定在一起,也就是说,每个 ResourceLoader 可以有独立的安全管理器。

安全管理器默认通过一个黑白名单列表来实现。黑白名单可以放在一个单独的文本文件中,也可以直接放在配置文件中。用户也可以实现自定义的安全管理器。

$securityManager = jetbrick.template.JetSecurityManagerImpl
# 
#$securityManager.configFile = ${web.root}/WEB-INF/jetx-black_white_list.txt
#
$securityManager.nameList = \
                            -java.lang.System.exit, \
                            -java.lang.reflect, \
                            -java.sql, \
                            -javax.tools, \
                            -java.io, \
                            +java.io.File.getName, \
                            +java.io.File.getPath, \
                            -sun

$loader = jetbrick.template.loader.FileSystemResourceLoader
$loader.root = /opt/templates/
$loader.reloadable = true
$loader.securityManager = $securityManager

jetx.template.loaders = $loader

§2.1 JetSecurityManagerImpl 属性说明

§2.2 黑白名单格式说明

前缀符号:

名单格式:

实例:

-java.sql                           // 禁止访问 java.sql 下面的任何 Class,包括所有孙子包下面的 Class
-java.lang.System.exit              // 禁止调用 System.exit() 方法
+java.util.Collections.EMPTY_LIST   // 允许访问 Collections.EMPTY_LIST 字段

§3. 为 JetEngine.createTemplate() 创建的模板,设置安全管理器

由于 JetEngine.createTemplate() 以源码方式创建的模板,并没有使用 ResourceLoader 来加载,所有必须使用其他的方式指定 JetSecurityManager

配置如下:

jetx.template.source.securityManager = $securityManager

§4. 自定义安全管理器

虽然 jetbrick-template 已经内置了一个默认的安全管理器实现,但是用户也可以实现自己的安全管理器。

需要实现接口: jetbrick.template.JetSecurityManager