JVM是怎樣進行授權控制的

原文见诸于http://www.matrix.org.cn/thread.shtml?topicId=41625&forumId=55
有网友提出疑问,

假設JVM已開啟了SecurityManager,并且JASS的登陸模塊等也正常運作,且授權策略文件醒置正確,用戶也已正確地成功地被驗証。如果不執行Subject.doAs()或Subject.doAsPrivileged()方法,JVM會對其它任何方法調用執行權限檢查嗎?如果會,其具的實現過程又是怎樣的? 

JAAS授權模型中對下面的情況講得好清楚:
  JVM由一个名为 SecurityManager 的类负责实施系统安全策略。在默认情况下不安装安全管理器,必须通过一个在启动时传递给 JVM 的一個名为 java.security.manager 的环境变量显式地指定。任何应用程序都可找到安装的 SecurityManager 并调用它相应的 check<XXX> 方法。
  对 SecurityManager 类进行的所有 check<XXX> 方法调用都解释为相应的 Permission 对象,并将它作为输入参数传递给 AccessController 类的 checkPermission() 方法。 AccessController 类有一个名为 doPrivileged 的方法。doPrivileged 方法以一个类型为 PrivilegedAction 的对象作为输入。PrivilegedAction 的对象有一个名为 run() 的方法,如果想實現一個執行權限檢查的操作,需從PirvilegedAction中擴展,並在run()方法中實現自己的業務邏輯即可。但問題是,如果不是從PirvilegedAction中擴展的類,那麼調用其中的方法JVM還會不會執行權限檢查?

從java API中可以看到,Subject.doAs()或Subject.doAsPrivileged()方法都以PrivilegedAction作為參數輸入的。

我做了一个小的形象总结:
通常来说,所有在JVM中执行的方法都回进行权限检查,except 那些由JVM引导的类,比如FileOutputStream和FileInputStream,你也明白你能够利用FileOuptStream做点什么坏事了,呵呵,于是你写了一个干坏事的类叫做EsunPirvilegedAction Class,这个类往用户的user.home写入n个1G的文件,这个类调用JVM不经过权限检查的FileOuptStream类。
问题在于,JVM虽然不检查FileOuptStream类,但会检查所有在JVM运行中未被授权的类,包括你的
EsunPirvilegedAction类,是否具有权限(判别标准就是C:\yourjdk\jre\lib\security\java.policy)。

1,Permission对象如何Load入,可以看看SecurityManager机制
2,AccessController 类执行checkPermission() 方法,所有不信任的类都不能逃过次"劫",当然,你可以叫所有Client都在其java.policy为你的创建一个Permission。
3,PrivilegedAction是你的EsunPirvilegedAction类所必需实现的方法,否则SecurityManager不理你。

总结性——Java有自己的信任体系,它引导的类以及它的扩展类都不需要checkPermission,你写的要checkPermission。
<!---->

你可能感兴趣的:(jvm,thread,Security)