[JAVA] SecurityManager

SecurityManager
  # import java.lang.SecurityManager;
SecurityManger允許app實做各自的security policy, 用來做access control check.
當然JVM本身也有實做自己的SecurityManger, 在執行前調用checkPermission()確認是否有執行請求的操作權限(ex. File, Socket, Net, Runtime, Property, AWT, Reflect跟Serializable), 不過一般都不會invoke它.
invoke JVM SM的方式有兩種:
   (1)在CLI下加上  "-Djava.security.manager", 安裝built-in default SM.
           ex. java -Djava.security.manager Myapp
   (2)在app中加入setSecurityManager() 來安裝SM

(註)可以使用 "-Djava.security.policy"來指定不同的policy file路徑,
要注意的是 '='表示除了security porperties 指定的policies外, 也會load所指定的policy file; '=='則表示只load 所指定的policy file, 其他的都會被忽略.

在實作方面, SecurityManager事實上只是個control point, 真正的實作則是在AccessController裡頭:

public class SecurityManager{
    ...
    public SecurityManager{
        SecurityManager sm = System.getSecurityManager();
        if (sm != null)
             sm.checkPermission(new RuntimePermission("createSecurityManager"));
    }
   ...
   public void checkPermission(Permission perm){
        AccessController.checkPermission(perm);
   }
   ...
   ...
}

(註) SecurityManager裡頭的checkXXX, 其實都是條用這個checkPermission

關於SecurityManager的範例可以參考這裡

最後就是doPrivileged(), 這是為了讓上層代碼執行不為AccessController允許的不可靠代碼, AccessController會允許使用該方法的使用者調用doPrivileged.


public SecureAction{
    if  (System.getSecurityManger() != null){
        try{
             String sprop1 = java.security.AccessController.doPrivileged(
                  new sun.security.action.GetPropertyAction("prop"));
             String sprop2 = java.security.AccessController.doPrivileged(
                  new java.security.PrivilegedAction<String>(){
                         public String run(){return System.getProperty("prop");}
                  });
        }catch (PrivilegedActionException e)
        {}
    }
}

Comments

Popular posts from this blog

股票評價(Stock Valuation) - 股利折現模型

openwrt feed的使用

How to convert Markdown into HTML