安全-访问控制器
扫描二维码
随时随地手机看文章
类java.security.AccessController提供了一个默认的安全策略执行机制,它使用栈检查来决定潜在不安全的操作是否被允许。
这个访问控制器不能被实例化,它不是一个对象。而是集合在单个类中的多个静态方法。
AccessController.checkPermission() 决定一个特定的操作能否被允许。
这个方法将指向Permission对象的引用作为唯一的参数,并且返回void。
如果AccessController确定这个操作被允许,将简单的返回;否则异常中止。
AccessController.checkPermission() 实现的基本算法决定了调用栈中的每个帧是否有权执行潜在不安全的操作。
每一个栈帧代表了由当前线程调用的某个方法,每一个方法是在某个类中定义的,每一个类属于某个保护域,每个保护域包含一些权限。为了使传递给AccessController.checkPermission() 的Permission对象所代表的的操作被允许,这个AccessController的基本算法要求,和调用栈上的每个帧相关连的权限必须包含或隐含传给checkPermission()的Permission对象
AccessController.checkPermission() 自顶向下检查栈,只要他遇到一个没有权限栈帧,它将抛出异常。
通过抛出异常,AccessController指明这个操作不能被允许。
相反,如果checkPermission() 方法到达栈的底部,也没有遇到这种栈帧情况,checkPermission() 将简单的返回。
通过简单返回而不是抛出异常,AccessController指明这个操作可以被允许。
调用AccessController.doPrivileged()方法中的任何一个,程序就可以让AccessController中止它对栈的一帧一帧的扫描。
implies()方法
它是在Permission类、PermissionCollection类、ProtectionDomain类中声明的。
将一个Permission对象作为它唯一的参数,返回布尔值true或者false。
Permission.implies确定由Permission对象所代表的的权限,是否在本质上隐含在由一个不同的Permission对象所代表的的权限中。PermissionCollection和ProtectionDomain的implies方法确认一个被传递的Permission是否包含或隐含在封装在PermissionCollection或ProtectionDomain中的Permission对象集合中。