策略管理器要讀取相應的策略文件,這些文件包含了將代碼來源映射爲權限的指令。下面是一個典型的策略文件: html
grant codeBase "http://www.horstmann.com/classes" { java
permission java.security.FilePermission "/tmp/*", "read,write"; sql
}; 安全
該文件給全部下載自http://www.horstmann.com/classes的代碼授予在/tmp目錄下讀取和寫入文件的權限。 app
能夠將策略文件安裝在標準位置上。默認狀況下,有兩個位置能夠安裝策略文件: dom
l <JAVA_HOME>/lib/security/java.security。<JAVA_HOME> 引用 java.home 系統屬性的值,並指定 JRE 的安裝目錄。 socket
l 用戶主目錄的 .java.policy 文件。 ide
能夠在java.security配置文件中修改這些文件的位置,默認位置設定爲: 測試
policy.url.1=file:${java.home}/lib/security/java.policy url
policy.url.2=file:${user.home}/.java.policy
若是你將策略文件存儲到文件系統以外,那麼能夠去實現Policy類的一個子類,讓其去收集所容許的權限。而後在java.security配置文件中更改下面這行:
policy.provider=sun.security.provider.PolicyFile
在測試期間,咱們不喜歡常常地修改標準策略文件。所以,咱們更願意爲每個應用程序配置顯式的策略文件,這樣將權限寫入一個獨立的文件(好比MyApp.policy)中便可。要將這個策略文件添加到其餘有效的策略中,能夠有兩個選擇。
l 在應用程序的main方法內部設置系統屬性:
System.setProperty("java.security.policy", "MyApp.policy");
l 像下面這樣啓動虛擬機:
Java –Djava.security.policy=MyApp.policy MyApp
對於applet,則能夠用以下的啓動命令:
appletviewer –J-Djava.security.policy=MyApp.policy MyApp MyApplet.html
可使用appletviewer的-J選項將任何命令行參數傳遞給虛擬機。
若是要只是用指定的策略文件,忽略標準策略文件,那麼須要在命令行中添加第二個等號:
Java –Djava.security.policy==MyApp.policy MyApp
警告:在測試期間,一個容易犯的錯誤是在當前用戶中留下了一個.java.policy文件,該文件授予了許許多多的權限。若是你發現你的應用程序彷佛沒有應用策略文件中的規定,就應該檢查當前目錄下的.java.policy文件。
在默認狀況下,Java應用程序是不安裝安全管理器的。所以,在安裝安全管理器以前,看不到策略文件的做用。有兩種方法來安裝安全管理器:
l 在main方法中添加下面這行代碼:
System.setSecurityManager(new SecurityManager());
l 在啓動虛擬機的時候添加命令行選項-Djava.security.manager
java –Djava.security.manager –Djava.security.policy=MyApp.policy MyApp
下面介紹整個策略文件的格式(不包含代碼證書部分)。
一個策略文件包含一系列grant項。每一項都具備如下的形式:
grant codesource
{
permission1;
permission2;
…
}
代碼來源包含一個代碼基(若是某一項適用於全部來源的代碼,則代碼基能夠省略)和值得信賴的用戶特徵(principal)與證書籤名者的名字(若是不要求對該項簽名,則能夠省略)。
代碼基能夠設定爲:
codebase "url"
若是URL以「/」結束,那麼它是一個目錄。不然,它將被視爲一個JAR文件的名字。該URL老是以「/」做爲文件分隔符,即便是Windows中的文件URL。
注意:策略文件閱讀器接受兩種格式的file URL,即file://localFile和file:localFile。此外,Windows驅動器名前面的斜槓是無關緊要的。例如:
file:C:/dir/filename.ext
file:/C:/dir/filename.ext
file://C:/dir/filename.ext
file:///C:/dir/filename.ext
file:////C:/dir/filename.ext
權限採用下面的結構:
permission className targetName, actionList;
l className 類名是權限類的全限定類名(好比java.io.FilePermission)。
l targetName目標名是個與權限相關的值,例如,文件權限中的目錄名或者文件名,或者是socket權限中的主機和端口。
l actionList 操做列表是一個操做方式的列表,好比read或connect等操做,用逗號分割。
有些權限類並不須要目標名和操做列表。
下表列出了標準的權限和它們執行的操做:
權限 |
目標 |
操做 |
java.io.FilePermission |
file 文件 directory 目錄 directory/ 目錄中的全部文件 * 當前目錄中的全部文件 directory/- 目錄和其子目錄中的全部文件 - 當前目錄和其子目錄中的全部文件 <<ALL FILES>> 文件系統中的全部文件 |
1. read 讀取指定的文件 2. write 對指定的文件進行寫操做 3. execute 4. delete 刪除指定的文件 |
java.net.SocketPermission |
Socket權限的目標由主機和端口範圍組成。 (1)主機的描述: hostname或IPaddress 單個主機 localhost或字符串 本地主機 *.domainSuffix 以給定後綴結尾的域中的全部主機 * 全部主機 (2)端口範圍的描述: :n 單個端口 :n- 編號大於等於n的全部端口 :-n 編號小於等於n的全部端口 :n1-n2 位於給定範圍內的全部端口 |
1. accept 接收一個來自於指定主機和端口號的socket鏈接 2. connect 打開一個指定主機和端口號的socket鏈接 3. listen 在指定的本地端口號上等待鏈接 4. resolve |
java.util.PropertyPermission |
property 一個具體的屬性 propertyPrefix.* 帶有給定前綴的全部屬性 |
1. read 訪問指定的系統屬性 2. write 修改指定的系統屬性 |
java.lang.RuntimePermission |
createClassLoader 建立一個新的類裝載器 getClassLoader setContextClassLoader enableContextClassLoaderOverride createSecurityManager exitVM 應用程序退出 getenv.variableName shutdownHooks setFactory 設置被ServerSocket或Socket使用的socket類或者設置被URL使用的URL流處理器 setIO modifyThread 改變一個線程(例如改變它的優先級,停止它等等) stopThread modifyThreadGroup 改變一個線程組(例如加入一個新的線程,設置守護進程等等) getProtectionDomain readFileDescriptor讀取指定的文件 writeFileDescriptor loadLibrary.libraryName 安裝一個包含本地方法的動態庫 accessClassInPackage.packageName 訪問指定的包(被類加載器使用)中的類型 defineClassInPackage.packageName 在指定的包(被類加載器使用)中加入一個新的類 accessDeclaredMembers.className queuePrintJob 初始化一個打印任務請求 getStackTrace setDefaultUncaughtExceptionHandler preferences usePolicy |
無 |
java.awt.AWTPermission |
showWindowWithoutWarningBanner accessClipboard accessEventQueue createRobot fullScreenExclusive listenToAllAWTEvents readDisplayPixels replaceKeyboardFocusManager watchMousePointer setWindowAlwaysOnTop setAppletStub |
無 |
java.net.NetPermission |
setDefaultAuthenticator specifyStreamHandler requestPasswordAuthentication setProxySelector getProxySelector setCookieHandler getCookieHandler setResponseCache getResponseCache |
無 |
java.lang.reflect.ReflectPermission |
suppressAccessChecks |
無 |
java.io.SerializablePermission |
enableSubclassImplementation enableSubstitution |
無 |
java.security.SecurityPermission |
createAccessControlContext getDomainCombiner getPolicy setPolicy getProperty.keyName setProperty.keyName insertProvider.providerName setProvider. providerName setSystemScope setIdentityPublicKey setIdentityInfo addIdentityCertificate removeIdentityCertificate printIdentity clearProviderProperties.providerName putProviderProperties.providerName removeProviderProperties.providerName getSignerPrivateKey setSignerKeyPair |
無 |
java.security.AllPermission |
無 |
無 |
javax.audio.AudioPermission |
運行記錄 |
無 |
javax.security.auth.AuthPermission |
doAs doAsPrivileged getSubject getSubjectFromDomainCombiner setReadOnly modifyPrincipals modifyPublicCredentials modifyPrivateCredentials refreshCredential destroyCredentia createLoginContext.contextName getLoginConfiguration setLoginConfiguration refreshLoginConfiguration |
無 |
java.util.logging.LoggingPermission |
control |
無 |
java.sql.SQLPermission |
setLog |
無 |