[读书笔记][java][安全]安全管理器

  
概念
策略(Policy)
      类装载器用Policy对象帮助它们决定,把一段代码导入虚拟机时应该给它们什么样的权限. 任何时候,
      每一个应用程序都只有一个Policy对象.
策略文件
      Sun的java1.2平台具体的Policy子类采用在一ASCII策略文件中用上下文无关文法描述安全策略.
       一个策略文件包括了一系列grant子句,每一个grant子句将一些权限授给一个代码来源。
保护域(ProtectionDomain)
       当类装载器将类型装入java虚拟机时,它们将为每一个类型指派一个保护域,保护域定义了授予
       一段特定的代码的所有权限.装载入java虚拟机的每一个类型都属于一个且仅属于一个保护域.
访问控制器(AccessController)
     implies()
          判断一个Permissioin对象的权限,是否隐含(imply)在另一个Permissioin对象的权限中。
    checkPermission()
         AccessController的核心方法,这个方法决定一个特定的操作能否被允许.
         它自顶向下检查栈,只要它遇到一个没有权限桢,它将抛出一个AccessControlException导常。
    doPrivileged()
         有的时候,调用栈较上层(更靠近栈顶)的代码可能希望执行一段代码,而这段代码在调用栈的较
         下层是不允许执行的。
          为了使可信的代码执行较不可靠的代码操作(这段不可靠的代码位于调用栈的较下层且没有执行
          这个操作的权限),AccessController类重载了四个名为doPrivileged()的静态方法.
          AccessController会忽略调用doPrivileged()方法的调用者的调用者的权限.
    Permission:
          权限是用抽象类java.security.Permission的一个子类的实例表示的.
    CodeSource:
         代码来源,包含代码库URL和签名者.
    Permissions:
        PermissionCollection(权限集合)的子类
        
装载时生成保护域的步骤:
1           根据指定的Policy文件生成一个Policy对象
2           生成CodeSource
3           用CodeSource在Policy中找到CodeSource对应的Permissions
4           用CodeSource和Permissons构造一个ProtectionDomain
5           把ProtectionDomain同这个类在方法区中的类数据联系起来(ClassLoader.defineClass()).
 
 
  运行权限检查:
如当前应用程序执行new FileInputStream(“a.txt”),java会检查当前代码有没有读”a.txt”的权限.
步骤:
1           调用SecurityManager.checkRead()方法
2           调用AccessControl.checkPermission()方法,执行栈检查
 
 
 
 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值