java securitymanager_Java中打开SecurityManager的方法

SecurityManager是java程序的安全管理器了,我们每一个程序都分有一个小天使保护着它了,下面我们来看看java中这个小天使的用法吧。

每个Java应用都可以有自己的安全管理器,它是防范恶意攻击的主要安全卫士。安全管理器通过执行运行阶段检查和访问授权,以实施应用所需的安全策略,从而保护资源免受恶意操作的攻击。实际上,安全管理器根据Java安全策略文件决定将哪组权限授予类。然而,当不可信的类和第三方应用使用JVM时,Java安全管理器将使用与JVM相关的安全策略来识别恶意操作。在很多情况下,威胁模型不包含运行于JVM中的恶意代码,此时Java安全管理器便不是必需的。当安全管理器检测到违反安全策略的操作时,JVM将引发 AccessControlException或SecurityException。

在Java应用中,安全管理器是由System类中的方法setSecurityManager设置的。要获得当前的安全管理器,可以使用方法 getSecurityManager。

java.lang.SecurityManager类包含了很多checkXXXX方法,如用于判断对文件访问权限的checkRead(String file)方法。这些检查方法调用SecurityManager.checkPermission方法,后者根据安全策略文件判断调用应用是否有执行所请求的操作权限。如果没有,将引发SecurityException。

如果想让应用使用安全管理器和安全策略,可在启动JVM时设定-Djava.security.manager选项,还可以同时指定安全策略文件。如果在应用中启用了Java安全管理器,却没有指定安全策略文件,那么Java安全管理器将使用默认的安全策略,它们是由位于目录$JAVA_HOME/jre /lib/security中的java.policy定义的。

1. 指定 -Djava.security.manager

当我们运行一个程序,我们可以指定JVM命令 -Djava.security.manager 使SecurityManager运行。

java -Djava.security.manager

这是打开SecurityManager最常见的方式。java.security.manager是一个系统属性,您可以使用System.getProperty("java.security.manager")检查该系统属性是否被设置。

在这里,你可能会认为,我们可以使用System.setProperty("java.security.manager")打开SecurityManager,但是并不能这么设置。因为先前我们提到,这个系统属性是在当JVM启动时进行检查的。如果我们用程序手动设置该属性,并不能奏效,因为JVM已经启动了,已经过了检查系统属性的步骤了。

2. 通过程序打开SecurityManager

现在,如果我们真的想通过我们的程序打开Se

curityManager,我们也能做到。System类中有一个叫 setSecurityManager() 的方法可以做到这一点。这个方法的参数是一个SecurityManager实例。

SecurityManager sm=new SecurityManager();

System.setSecurityManager(sm);

通过这个,我们可以打开SecurityManager.。如果之后我们想要关闭SecurityManager, 我们该怎么做? 下面的代码能做到吗?

SecurityManager sm=System.getSecurityManager();

if(sm!=null){

System.setSecurityManager(null);

}

上面的代码只有你在位于${JAVA_HOME}/lib/security目录下或者其他指定目录下的java.policy文件中指定了一个权限才会奏效。 这个权限是:

permission java.lang.RuntimePermission "setSecurityManager";

上面的一行将被用来允许代码设置SecurityManager。

3. 在build文件中

我们想打开SecurityManager,如果我们使用Ant构建应用程序时, 我们可以加上:

我们通过Ant创建单元测试的时候非常有用。

创建一个SecurityManager的子类;(2) 覆盖一些方法。

import java.io.*;

public class TestSecurity

{

public static void main(String args[])

{

try {

System.setSecurityManager(new PasswordSecurityManager("123456"));

} catch (SecurityException se) {

System.out.println("SecurityManager already set!");

}

try {

//DataInputStream fis = new DataInputStream(new FileInputStream("input.txt"));

BufferedReader fis = new BufferedReader(new FileReader("input.txt"));

//DataOutputStream fos = new DataOutputStream( new FileOutputStream("output.txt"));

BufferedWriter fos = new BufferedWriter(new FileWriter("output.txt"));

String inputString;

while ((inputString = fis.readLine()) != null) {

//fos.writeBytes(inputString);

//fos.writeByte('\n');

fos.write(inputString);

fos.write('\n');

}

fis.close();

fos.close();

} catch (IOException ioe) {

System.out.println("I/O failed for SecurityManagerTest.");

}catch(Exception e)

{

System.out.println(e.toString());

}

}

}

import java.io.*;

class PasswordSecurityManager extends SecurityManager {

private String password;

PasswordSecurityManager(String password) {

super();

this.password = password;

}

private boolean accessOK() {

int c;

//DataInputStream dis = new DataInputStream(System.in);

BufferedReader dis = new BufferedReader(new InputStreamReader(System.in));

String response;

System.out.println("What's the secret password?");

try {

response = dis.readLine();

if (response.equals(password))

return true;

else

return false;

} catch (IOException e) {

return false;

}

}

public void checkRead(FileDescriptor filedescriptor) {

if (!accessOK())

throw new SecurityException("Not a Chance!");

}

public void checkRead(String filename) {

if (!accessOK())

throw new SecurityException("No Way!");

}

public void checkRead(String filename, Object executionContext) {

if (!accessOK())

throw new SecurityException("Forget It!");

}

public void checkWrite(FileDescriptor filedescriptor) {

if (!accessOK())

throw new SecurityException("Not!");

}

public void checkWrite(String filename) {

if (!accessOK())

throw new SecurityException("Not Even!");

}

}

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值