java中的SecurityManager类

安全管理器是一个允许应用程序实现安全策略的类。它允许应用程序在执行可能不安全或敏感的操作之前确定该操作是什么,以及是否在允许执行该操作的安全上下文中尝试该操作。应用程序可以允许或不允许该操作。

SecurityManager类包含许多名称以单词check开头的方法。在这些方法执行某些潜在的敏感操作之前,Java库中的各种方法都会调用这些方法。这种检查方法的调用通常如下所示:

SecurityManager security = System.getSecurityManager();
if (security != null) {
security.checkXXX(argument, . . . );
}
因此,安全管理器有机会通过抛出异常来阻止操作的完成。如果允许该操作,安全管理器例程只返回,但如果不允许该操作,则抛出SecurityException。此约定的唯一例外是checktoplevelwindow,它返回一个布尔值。

当前安全管理器由类系统中的setSecurityManager方法设置。当前的安全管理器是通过getsecuritymanager方法获得的。

特殊方法checkpermission(java.security.permission)确定是否应授予或拒绝由指定权限指示的访问请求。默认实现调用

AccessController.checkPermission(perm);

如果允许请求的访问,则checkpermission将悄悄返回。如果拒绝,则引发SecurityException。

从Java2SDKv1.2开始,SecurityManager中其他每个检查方法的默认实现是调用SecurityManager检查权限方法,以确定调用线程是否具有执行请求操作的权限。

注意,只有一个permission参数的checkpermission方法总是在当前执行线程的上下文中执行安全检查。有时,应该在给定上下文中执行的安全检查实际上需要在不同上下文中执行(例如,在工作线程中)。在这种情况下,将提供getSecurityContext方法和包含上下文参数的checkPermission方法getSecurityContext方法返回当前调用上下文的“快照”。(默认实现返回AccessControlContext对象。)下面是一个示例调用:

Object context = null;
SecurityManager sm = System.getSecurityManager();
if (sm != null) context = sm.getSecurityContext();

checkPermission方法除了获取权限之外还获取一个上下文对象,它根据该上下文而不是当前执行线程的上下文做出访问决策。因此,不同上下文中的代码可以调用该方法,传递权限和先前保存的上下文对象。使用前面示例中获得的securitymanager sm的示例调用如下:
if (sm != null) sm.checkPermission(permission, context);

权限分为以下类别:文件、套接字、网络、安全性、运行时、属性、awt、反射和可序列化。管理这些不同权限类别的类有java.io.FilePermission、java.net.SocketPermission、java.net.net permission、java.security.SecurityPermission、java.lang.RuntimePermission、java.util.PropertyPermission、java.awt.awtppermission、java.lang.reflect.reflectppermission和java.io.serializablepmission。

除了前两个(FilePermission和SocketPermission)之外,其余都是java.security.BasicPermission的子类,它本身是权限顶级类java.security.Permission的抽象子类Basic权限定义了所有权限的功能,这些权限包含遵循分层属性命名约定的名称(例如,“EXITVM”、“StEngStand”、“QuealPrimtPo作业”等)。星号可以出现在名称的末尾,在“.”后面,或者它本身表示通配符匹配。例如:“a.”或“”有效,“a”或“ab”无效。

filePermission和socketPermission是顶级权限类(java.security.permission)的子类。这些类的名称语法比basicpermission子类直接从权限而不是basicpermission使用的名称语法更复杂。例如,对于java.io.filePermission对象,权限名称是文件(或目录)的路径名。

一些权限类有一个“操作”列表,它告诉对象允许的操作。例如,对于java.io.filePermission对象,操作列表(例如“读、写”)指定为指定文件(或指定目录中的文件)授予哪些操作。

其他权限类用于“命名”权限-那些包含名称但没有操作列表的权限;您要么拥有命名权限,要么没有。

注意:还有一个java.security.all permission权限表示所有权限。它的存在是为了简化系统管理员的工作,这些系统管理员可能需要执行需要所有(或多个)权限的多个任务。

有关权限的信息,请参阅JDK中的权限例如,此文档包含一个表,其中列出了各种SecurityManager检查方法以及每个此类方法的默认实现所需的权限它还包含一个包含所有需要权限的1.2版方法的表,对于每个这样的方法,它都会告诉您它需要哪些权限。

有关在jdk中进行的securitymanager更改的更多信息以及有关移植1.1风格安全管理器的建议,请参阅安全文档。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值