0%

jdk文档定义

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

SecurityManager 类包含了很多名称以单词 check 开头的方法。Java 库中的各种方法在执行某些潜在的敏感操作前可以调用这些方法。对 check 方法的典型调用如下:

 SecurityManager security = System.getSecurityManager();
 if (security != null) {
     security.checkXXX(argument,  . . . );
 }

因此,安全管理器通过抛出异常来提供阻止操作完成的机会。如果允许执行该操作,则安全管理器例程只是简单地返回,但如果不允许执行该操作,则抛出一个 SecurityException。该约定的唯一例外是 checkTopLevelWindow,它返回 boolean 值。

getSecurityManager
public static SecurityManager getSecurityManager(){
      return security;
}

获取系统安全接口。

返回:
如果已经为当前应用程序建立了安全管理器,则返回此安全管理器;否则,返回 null。

File.listFiles()源码分析

public File[] listFiles() {
    String[] ss = list();
    if (ss == null) return null;
    int n = ss.length;
    File[] fs = new File[n];
    for (int i = 0; i < n; i++) {
        fs[i] = new File(ss[i], this);
    }
    return fs;
}

public String[] list() {
        SecurityManager security = System.getSecurityManager(); //获取系统安全接口
        if (security != null) {
            security.checkRead(path);
            //判断线程是否有读取文件的权限,权限可以自己去用System.setSecurityManager(SecurityManager  Object)去set
        }
        if (isInvalid()) {
            return null;
        }
        return fs.list(this);
    }

final boolean isInvalid() {
        if (status == null) {
            status = (this.path.indexOf('\u0000') < 0) ? PathStatus.CHECKED
                                                       : PathStatus.INVALID;
        }
        return status == PathStatus.INVALID;
}

public void checkRead(String file) {
        checkPermission(new FilePermission(file,
            SecurityConstants.FILE_READ_ACTION));
}

public abstract String[] list(File f);

@Override
public native String[] list(File f);//调用的系统原生方法,要具体去看jdk的源码或者监控dll调用,
                                    // 反正只要明白此处使用的是操作系统原生的方法

checkRead
public void checkRead(String file)
如果不允许调用线程读取由字符串参数指定的文件,则抛出 SecurityException。
此方法用 FilePermission(file,”read”) 权限调用 checkPermission。
如果重写此方法,那么通常应该在已重写方法将要抛出异常时调用 super.checkRead。
参数:
file - 取决于系统的文件名。
抛出:
SecurityException - 如果调用线程没有访问指定文件的权限。
NullPointerException - 如果 file 参数为 null。