Java中的SecurityException是什么?

  • Post category:Java

SecurityException是Java中一个运行时异常,它表示在安全管理器检测到安全冲突时抛出。安全管理器用于控制代码在运行时执行的操作。如果操作被禁止,安全管理器将抛出SecurityException。

以下是安全管理器可能会禁止的操作:

  • 读或写文件或目录
  • 连接到网络
  • 执行本地代码
  • 从文件或URL中加载类
  • 关闭JVM
  • 等等

SecurityException通常是由于安全策略不允许某些操作而抛出的。当Java应用程序需要执行某些受限操作时,必须先配置安全策略文件以授权这些操作。如果在执行时发现没有授权,就会抛出SecurityException异常。

以下是两个示例说明:

示例1

下面的代码尝试读取文件系统中的文件,但是如果当前安全策略不允许读取文件系统,它将抛出SecurityException异常:

import java.io.*;

public class FileReadExample {
    public static void main(String[] args) {
        try {
            BufferedReader reader = new BufferedReader(new FileReader("example.txt"));
            String line;
            while ((line = reader.readLine()) != null) {
                System.out.println(line);
            }
            reader.close();
        } catch (IOException e) {
            e.printStackTrace();
        } catch (SecurityException e) { //捕获 SecurityException
            e.printStackTrace();
        }
    }
}

如果没有授予程序读取文件系统的权限,那么就会输出以下内容:

java.security.AccessControlException: access denied ("java.io.FilePermission" "example.txt" "read")
    at java.security.AccessControlContext.checkPermission(AccessControlContext.java:472)
    at java.security.AccessController.checkPermission(AccessController.java:884)
    at java.lang.SecurityManager.checkPermission(SecurityManager.java:549)
    at java.lang.SecurityManager.checkRead(SecurityManager.java:888)
    at java.io.File.isFile(File.java:907)
    at java.io.File.canRead(File.java:1082)
    at java.io.BufferedReader.<init>(BufferedReader.java:86)
    at java.io.BufferedReader.<init>(BufferedReader.java:128)
    at FileReadExample.main(FileReadExample.java:7)

示例2

下面的代码尝试执行本地代码,但是如果当前安全策略不允许执行本地代码,它将抛出SecurityException异常:

import java.security.*;

public class LocalCodeExample {
    public static void main(String[] args) {
        try {
            SecurityManager securityManager = new SecurityManager() {
                @Override
                public void checkPermission(Permission permission) {
                    if (permission.getName().startsWith("java.lang.RuntimePermission") && permission.getName().endsWith("loadLibrary")) {
                        throw new SecurityException("Executing local code is not allowed");
                    }
                }
            };
            System.setSecurityManager(securityManager);
            System.loadLibrary("mylibrary");
        } catch (SecurityException e) { //捕获 SecurityException
            e.printStackTrace();
        }
    }
}

如果没有授予程序执行本地代码的权限,那么就会输出以下内容:

java.security.AccessControlException: access denied ("java.lang.RuntimePermission" "loadLibrary.mylibrary")
    at java.security.AccessControlContext.checkPermission(AccessControlContext.java:472)
    at java.security.AccessController.checkPermission(AccessController.java:884)
    at java.lang.SecurityManager.checkPermission(SecurityManager.java:549)
    at java.lang.System.loadLibrary(System.java:1578)
    at LocalCodeExample.main(LocalCodeExample.java:14)