Java安全应该包括两方面的内容,一是Java平台(即是Java运行环境)的安全性;二是Java语言开发的应用程序的安全性。由于我们不是Java本身语言的制定开发者,所以第一个安全性不需要我们考虑。其中第二个安全性是我们重点考虑的问题,一般我们可以通过安全管理器机制来完善安全性,安全管理器是安全的实施者,可对此类进行扩展,它提供了加在应用程序上的安全措施,通过配置安全策略文件达到对网络、本地文件和程序其它部分的访问限制的效果。
当Java应用程序运行时,它们可以访问计算机上的资源,例如文件系统、网络、系统属性等。SecurityManager是Java中的一个类,它允许开发人员控制应用程序对这些资源的访问。SecurityManager可以实现以下功能:
在Java中,可以通过System.setSecurityManager()方法来设置SecurityManager。开发人员可以编写自己的SecurityManager类,以实现自定义的安全策略管理、访问控制、权限管理和安全审计功能。
一般而言,Java程序启动时并不会自动启动安全管理器,可以通过以下两种方法启动安全管理器:
在启动安全管理器时可以通过-Djava.security.policy选项来指定安全策略文件。如果没有指定策略文件的路径,那么安全管理器将使用默认的安全策略文件,它位于%JAVA_HOME%/jre/lib/security目录下面的java.policy。需要说明一下的是,=表示这个策略文件将和默认的策略文件一同发挥作用;==表示只使用这个策略文件。
那么如何才能实现自己的安全管理器,并且配置权限呢?下面将通过一个简单的例子阐明实现步骤,一般可以分为以下两步:
public class SecurityManagerTest {
public static void main(String[] args) throws FileNotFoundException {
System.out.println("SecurityManager: " + System.getSecurityManager());
FileInputStream fis = new FileInputStream("c:\\protect.txt");
System.out.println(System.getProperty("file.encoding"));
}
}
分下面几种情况运行程序:
grant {
permissionjava.io.FilePermission "c:/protect.txt", "read";
};
此时SecurityManager不为空,并且有权限读取protect.txt文件,但最终还是会抛一个AccessControlException异常,因为并没有权限读取file.encoding系统属性。
grant {
permissionjava.io.FilePermission "c:/protect.txt", "read";
permissionjava.util.PropertyPermission "file.encoding", "read";
};
这次读取文件跟读取系统属性的权限都有了,程序正常运行,不再抛出安全异常。
由上面几种情况我们清晰了解安全管理器的使用,通过简单地配置策略文件能达到应用安全的管理。Java的Permission类是用来定义类所拥有的权限,Java本身包括了一些 Permission类,如下:
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。