2014-12-10 39 views
3

Groovy in Action提供以下代码,通过SecureASTCustomizer为DSL提供安全性。在Groovy中实现DSL白名单

// @author: Groovy in Action 
import org.codehaus.groovy.control.* 
import org.codehaus.groovy.control.customizers.* 

def secure = new SecureASTCustomizer() 

secure.with { 
        closuresAllowed = false 
        methodDefinitionAllowed = false 
        importsWhitelist = [] 

        staticImportsWhitelist = [] 
        staticStarImportsWhitelist = ['java.lang.Math'] 

        tokensWhitelist = [ 
        PLUS, MINUS, MULTIPLY, DIVIDE, MOD, POWER, 
        PLUS_PLUS, MINUS_MINUS, 
        COMPARE_EQUAL, COMPARE_NOT_EQUAL, 
        COMPARE_LESS_THAN, COMPARE_LESS_THAN_EQUAL, 
        COMPARE_GREATER_THAN, COMPARE_GREATER_THAN_EQUAL, 
        ] 

        constantTypesClassesWhiteList = [ 
        Integer, Float, Long, Double, BigDecimal, 
        Integer.TYPE, Long.TYPE, Float.TYPE, Double.TYPE 
        ] 

        receiversClassesWhiteList = [ 
        Math, Integer, Float, Double, Long, BigDecimal 
        ] 

        statementsWhitelist = [ 
        BlockStatement, ExpressionStatement 
        ] 

        expressionsWhitelist = [ 
        BinaryExpression, ConstantExpression, 
        MethodCallExpression, StaticMethodCallExpression, 
        ArgumentListExpression, PropertyExpression, 
        UnaryMinusExpression, UnaryPlusExpression, 
        PrefixExpression, PostfixExpression, 
        TernaryExpression, ElvisOperatorExpression, 
        BooleanExpression, ClassExpression 
        ] 
} 

def config = new CompilerConfiguration() 
config.addCompilationCustomizers(secure) 

def shell = new GroovyShell(config) 

x = shell.evaluate ''' 
    5 + 10 
    println("exiting...") 
    System.exit(0) 
''' 

println x 

但是,当我运行此代码时,出现运行时错误。

如何修复错误以获得工作示例 - 即执行数学运算的DSL,不允许任何其他类型的命令,如System.exit(0)

>groovy WhiteListSimple.groovy 
Caught: groovy.lang.MissingPropertyException: No such property: PLUS for class: org.codehaus.groovy.control.customizers.SecureASTCustomizer 
groovy.lang.MissingPropertyException: No such property: PLUS for class: org.codehaus.groovy.control.customizers.SecureASTCustomizer 
     at WhiteListSimple$_run_closure1.doCall(WhiteListSimple.groovy:14) 
     at WhiteListSimple.run(WhiteListSimple.groovy:6) 

回答

2

​​和朋友现在都在

import static org.codehaus.groovy.syntax.Types.* 

而且你还需要

import org.codehaus.groovy.ast.stmt.* // for the classes in `statementsWhitelist` 
import org.codehaus.groovy.ast.expr.* // for the classes in `expressionsWhitelist` 

考虑,这本书是2009年和你使用的是现在一个时髦范围2.3,包或类的位置只是随着时间的推移而变化,或者源代码从来没有工作过。

您可能想要考虑一个IDE,它可以帮助您找到课程/为您创建import