securitymanager.java
来自「This is a resource based on j2me embedde」· Java 代码 · 共 1,623 行 · 第 1/5 页
JAVA
1,623 行
/* * @(#)SecurityManager.java 1.138 06/10/10 * * Copyright 1990-2008 Sun Microsystems, Inc. All Rights Reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License version * 2 only, as published by the Free Software Foundation. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License version 2 for more details (a copy is * included at /legal/license.txt). * * You should have received a copy of the GNU General Public License * version 2 along with this work; if not, write to the Free Software * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA * 02110-1301 USA * * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa * Clara, CA 95054 or visit www.sun.com if you need additional * information or have any questions. * */package java.lang;import java.security.*;import java.io.FileDescriptor;import java.io.File;import java.io.FilePermission;import java.util.PropertyPermission;import java.lang.RuntimePermission;import java.net.SocketPermission;import java.net.NetPermission;import java.util.Hashtable;import java.net.InetAddress;import java.lang.reflect.Member;import java.lang.reflect.*;import java.net.URL;import sun.security.util.SecurityConstants;/** * The security manager is a class that allows * applications to implement a security policy. It allows an * application to determine, before performing a possibly unsafe or * sensitive operation, what the operation is and whether * it is being attempted in a security context that allows the * operation to be performed. The * application can allow or disallow the operation. * <p> * The <code>SecurityManager</code> class contains many methods with * names that begin with the word <code>check</code>. These methods * are called by various methods in the Java libraries before those * methods perform certain potentially sensitive operations. The * invocation of such a <code>check</code> method typically looks like this: * <p><blockquote><pre> * SecurityManager security = System.getSecurityManager(); * if (security != null) { * security.check<i>XXX</i>(argument, . . . ); * } * </pre></blockquote> * <p> * The security manager is thereby given an opportunity to prevent * completion of the operation by throwing an exception. A security * manager routine simply returns if the operation is permitted, but * throws a <code>SecurityException</code> if the operation is not * permitted. The only exception to this convention is * <code>checkTopLevelWindow</code>, which returns a * <code>boolean</code> value. * <p> * The current security manager is set by the * <code>setSecurityManager</code> method in class * <code>System</code>. The current security manager is obtained * by the <code>getSecurityManager</code> method. * <p> * The special method * {@link SecurityManager#checkPermission(java.security.Permission)} * determines whether an access request indicated by a specified * permission should be granted or denied. The * default implementation calls * * <pre> * AccessController.checkPermission(perm); * </pre> * * <p> * If a requested access is allowed, * <code>checkPermission</code> returns quietly. If denied, a * <code>SecurityException</code> is thrown. * <p> * As of Java 2 SDK v1.2, the default implementation of each of the other * <code>check</code> methods in <code>SecurityManager</code> is to * call the <code>SecurityManager checkPermission</code> method * to determine if the calling thread has permission to perform the requested * operation. * <p> * Note that the <code>checkPermission</code> method with * just a single permission argument always performs security checks * within the context of the currently executing thread. * Sometimes a security check that should be made within a given context * will actually need to be done from within a * <i>different</i> context (for example, from within a worker thread). * The {@link SecurityManager#getSecurityContext getSecurityContext} method * and the {@link SecurityManager#checkPermission(java.security.Permission, * java.lang.Object) checkPermission} * method that includes a context argument are provided * for this situation. The * <code>getSecurityContext</code> method returns a "snapshot" * of the current calling context. (The default implementation * returns an AccessControlContext object.) A sample call is * the following: * * <pre> * Object context = null; * SecurityManager sm = System.getSecurityManager(); * if (sm != null) context = sm.getSecurityContext(); * </pre> * * <p> * The <code>checkPermission</code> method * that takes a context object in addition to a permission * makes access decisions based on that context, * rather than on that of the current execution thread. * Code within a different context can thus call that method, * passing the permission and the * previously-saved context object. A sample call, using the * SecurityManager <code>sm</code> obtained as in the previous example, * is the following: * * <pre> * if (sm != null) sm.checkPermission(permission, context); * </pre> * * <p>Permissions fall into these categories: File, Socket, Net, * Security, Runtime, Property, AWT, Reflect, and Serializable. * The classes managing these various * permission categories are <code>java.io.FilePermission</code>, * <code>java.net.SocketPermission</code>, * <code>java.net.NetPermission</code>, * <code>java.security.SecurityPermission</code>, * <code>java.lang.RuntimePermission</code>, * <code>java.util.PropertyPermission</code>, * <code>java.lang.reflect.ReflectPermission</code>, and * <code>java.io.SerializablePermission</code>. * * <p>All but the first two (FilePermission and SocketPermission) are * subclasses of <code>java.security.BasicPermission</code>, which itself * is an abstract subclass of the * top-level class for permissions, which is * <code>java.security.Permission</code>. BasicPermission defines the * functionality needed for all permissions that contain a name * that follows the hierarchical property naming convention * (for example, "exitVM", "setFactory", "queuePrintJob", etc). * An asterisk * may appear at the end of the name, following a ".", or by itself, to * signify a wildcard match. For example: "a.*" or "*" is valid, * "*a" or "a*b" is not valid. * * <p>FilePermission and SocketPermission are subclasses of the * top-level class for permissions * (<code>java.security.Permission</code>). Classes like these * that have a more complicated name syntax than that used by * BasicPermission subclass directly from Permission rather than from * BasicPermission. For example, * for a <code>java.io.FilePermission</code> object, the permission name is * the path name of a file (or directory). * * <p>Some of the permission classes have an "actions" list that tells * the actions that are permitted for the object. For example, * for a <code>java.io.FilePermission</code> object, the actions list * (such as "read, write") specifies which actions are granted for the * specified file (or for files in the specified directory). * * <p>Other permission classes are for "named" permissions - * ones that contain a name but no actions list; you either have the * named permission or you don't. * * <p>Note: There is also a <code>java.security.AllPermission</code> * permission that implies all permissions. It exists to simplify the work * of system administrators who might need to perform multiple * tasks that require all (or numerous) permissions. * <p> * See <a href ="../../../guide/security/permissions.html"> * Permissions in the Java 2 SDK</a> for permission-related information. * This document includes, for example, a table listing the various SecurityManager * <code>check</code> methods and the permission(s) the default * implementation of each such method requires. * It also contains a table of all the version 1.2 methods * that require permissions, and for each such method tells * which permission it requires. * <p> * For more information about <code>SecurityManager</code> changes made in * the Java 2 SDK and advice regarding porting of 1.1-style security managers, * see the <a href="../../../guide/security/index.html">security documentation</a>. * * @author Arthur van Hoff * @author Roland Schemers * * @version 1.125, 05/16/00 * @see java.lang.ClassLoader * @see java.lang.SecurityException * @see java.lang.SecurityManager#checkTopLevelWindow(java.lang.Object) * checkTopLevelWindow * @see java.lang.System#getSecurityManager() getSecurityManager * @see java.lang.System#setSecurityManager(java.lang.SecurityManager) * setSecurityManager * @see java.security.AccessController AccessController * @see java.security.AccessControlContext AccessControlContext * @see java.security.AccessControlException AccessControlException * @see java.security.Permission * @see java.security.BasicPermission * @see java.io.FilePermission * @see java.net.SocketPermission * @see java.util.PropertyPermission * @see java.lang.RuntimePermission * @see java.security.Policy Policy * @see java.security.SecurityPermission SecurityPermission * @see java.security.ProtectionDomain * * @since JDK1.0 */public class SecurityManager { /** * This field is <code>true</code> if there is a security check in * progress; <code>false</code> otherwise. * * deprecated This type of security checking is not recommended. * It is recommended that the <code>checkPermission</code> * call be used instead. * protected boolean inCheck; */ /* * Have we been initialized. Effective against finalizer attacks. */ private boolean initialized = false; private static Constructor AWTPermissionCtor; private static BasicPermission topLevelWindowPermission; /** * returns true if the current context has been granted AllPermission */ private boolean hasAllPermission() { try { checkPermission(SecurityConstants.ALL_PERMISSION); return true; } catch (SecurityException se) { return false; } } /** * Tests if there is a security check in progress. * * return the value of the <code>inCheck</code> field. This field * should contain <code>true</code> if a security check is * in progress, * <code>false</code> otherwise. * see java.lang.SecurityManager#inCheck * deprecated This type of security checking is not recommended. * It is recommended that the <code>checkPermission</code> * call be used instead. * public boolean getInCheck() { return inCheck; } */ /** * Constructs a new <code>SecurityManager</code>. * * <p> If there is a security manager already installed, this method first * calls the security manager's <code>checkPermission</code> method * with the <code>RuntimePermission("createSecurityManager")</code> * permission to ensure the calling thread has permission to create a new * security manager. * This may result in throwing a <code>SecurityException</code>. * * @exception java.lang.SecurityException if a security manager already * exists and its <code>checkPermission</code> method * doesn't allow creation of a new security manager. * @see java.lang.System#getSecurityManager() * @see #checkPermission(java.security.Permission) checkPermission * @see java.lang.RuntimePermission */ public SecurityManager() { synchronized(SecurityManager.class) { SecurityManager sm = System.getSecurityManager(); if (sm != null) { // ask the currently installed security manager if we // can create a new one. sm.checkPermission(new RuntimePermission ("createSecurityManager")); } initialized = true; } } /** * Returns the current execution stack as an array of classes. * <p> * The length of the array is the number of methods on the execution * stack. The element at index <code>0</code> is the class of the * currently executing method, the element at index <code>1</code> is * the class of that method's caller, and so on. * * @return the execution stack. */ protected native Class[] getClassContext(); /** * Returns the class loader of the most recently executing method from * a class defined using a non-system class loader. A non-system * class loader is defined as being a class loader that is not equal to
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?