安全管理器与访问权限

6 篇文章 0 订阅

 

它允许应用程序在执行一个可能不安全或敏感的操作前确定该操作是什么,以及是否是在允许执行该操作的安全上下文中执行它。应用程序可以允许或不允许该操作。

安全管理器的作用在于,用户在执行某个操作时,调用安全管理器来进行check,有此权限则通过,没有则抛异常。jdk中很多类出于安全的考虑,在他们特定的方法中会调用安全管理器进行判断(如我们在通过反射获取了一个类的Method对象时,再执行invoke方法执行时 会调用安全管理器进行访问控制符权限的判定,若对此方法不可见,则抛异常)。当然用户可以通过方法setAccessible(true)来设定为可访问,该方法内会调用安全管理器进行判断有无权限进行此操作,若无权限,则用户仍不能执行该方法(在运行时使用反射分析对象,如果访问的是私有域或是私有方法,私有构造函数,会抛出IllegalAccessException.因为反射机制的默认行为受限于java的访问控制,然而,如果一个java程序没有受到安全管理器的控制,就可以覆盖访问控制

 

一旦某个类被加载到虚拟机中,并由检验器检查过之后,Java平台的第二种安全机制就会启动,这个机制就是安全管理器。安全管理器是一个负责控制某个操作是否允许执行的类。安全管理器负责检查的操作包括以下几个:

创建一个新的类加载器;

退出虚拟机;

使用反射访问另一个类的成员;(不通过反射进行访问时,编译期间已经对访问控制权限进行了检查,因此若正确编译了,就不会在运行时出问题)

访问本地文件;

打开socket连接;

启动打印作业;

访问系统剪贴板;

访问AWT事件队列;

打开一个顶层窗口。

整个Java类库中还有许多其他类似的检查。

在运行Java应用程序时,默认的设置是不安装安全管理器的,这样所有的操作都是允许的。另一方面,applet浏览器会执行一个功能受限的安全策略。

例如,applet不允许退出虚拟机。如果它们试图调用exit方法,就会抛出一个安全异常。下面将详细说明这种情况。Runtime类的exit方法调用安全管理器的checkExit方法,下面是exit方法的全部代码:

public void exit(int status)
{
SecurityManager security = System.getSecurityManager();
if (security != null)
security.checkExit(status);
exitInternal(status);
}

这时安全管理器要检查退出请求是来自浏览器还是单个的applet程序。如果安全管理器同意了退出请求,那么checkExit便直接返回并继续处理下面正常的操作。但是,如果安全管理器不同意退出请求,那么checkExit方法就会抛出一个SecurityException异常。

只有当没有任何异常发生时,exit方法才能继续执行。然后它调用本地私有的exitInternal方法,实际终止虚拟机的运行。没有其他的方法可以终止虚拟机的运行,因为exitInternal方法是私有的,任何其他类都不能调用它。因此,任何试图退出虚拟机的代码都必须通过exit方法,从而在不触发安全异常的情况下,通过checkExit安全检查。

显然,安全策略的完整性依赖于谨慎的编码。标准类库中系统服务的提供者,在试图继续任何敏感的操作之前,都必须与安全管理器进行协商。


Java平台的安全管理器,不仅允许系统管理员,而且允许程序员对各个安全访问权限实施细致的控制。我们将在下一节介绍这些特性。首先,我们将介绍Java 2 平台的安全模型的概况,然后介绍如何使用策略文件对各个权限实施控制。最后,我们要介绍如何来定义你自己的权限类型。

注意

实现并安装自己的安全管理器是可行的,但是你不应该进行这种尝试,除非你是计算机安全方面的专家。配置标准的安全管理器更加安全

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值