2016-12-30 44 views
0

聲明:舊版本的問題令人困惑SecurityManagerAccessController。但是現在我知道我犯了一個錯誤,而且這個問題已經完善了。AccessController爲什麼不阻止非特權訪問

莖很直接;我正在尋找一種方法來限制腳本在某些ScriptEngine中可以執行的操作。

我讀過一些類似的新舊問題。似乎有一個解決方案NashornScriptEngine使用一個名爲ClassFilter的類。但是我正在尋找一種通用的方式,無論他們的腳本引擎實現如何。有人認爲Java的AccessController就是這樣。所以我開始閱讀和玩AccessController,到目前爲止,我得到這個:

ScriptEngineManager manager = new ScriptEngineManager(); 
ScriptEngine engine = manager.getEngineByName("nashorn"); 

Permissions perms = new Permissions(); 
ProtectionDomain domain = new ProtectionDomain(new CodeSource(null, (Certificate[]) null), perms); 
AccessControlContext acc = new AccessControlContext(new ProtectionDomain[] { domain }); 

AccessController.doPrivileged(new PrivilegedAction() { 
    @Override 
    public Object run() { 
     try { 
      //I want the following line to throw a SecurityException 
      return engine.eval("var System = Java.type('java.lang.System'); print(System.getProperty('java.home'));"); 
     } 
     catch (ScriptException e) { 
      e.printStackTrace(); 
     } 
     return null; 
    }}, 
    acc 
); 

//At the same time I want the following line to work 
System.out.println(System.getProperty("java.home")); 

和腳本運行,就好像沒有涉及AccessController的!

所以我的問題是,是AccessController這樣做的方法嗎?如果是,那我該怎麼做呢?

+0

明確的方式來做到這一點,但我沒有看到一個SecurityManager正在您的代碼中註冊 –

+0

您能告訴我如何解決這個代碼?我不知道它有什麼問題。還有一件事,我的應用程序的其餘部分是好的。換句話說,我想將SecurityManager應用到'engine.eval'行,而不是應用程序的其餘部分。謝謝。 – Mehran

回答

0

所以我設法解決了這個問題。在閱讀了一會兒之後,我發現如果SecurityManager沒有被激活,那麼AccessController不起作用。這裏是你如何激活它:

  1. 添加兩個VM選項:-Djava.security.manager -Djava.security.policy=security.policy

  2. 創建security.policy文件中的項目的根文件夾中,有如下內容: grant { permission java.security.AllPermission; };

這將爲您的項目激活SecurityManager並授予其所有權限。換句話說,它只會激活SecurityManager,但您的代碼將像以前一樣工作。現在您可以使用上面給出的代碼來控制應用程序的部分訪問控制。