當前位置:首頁 » 代理許可 » jaas授權類

jaas授權類

發布時間: 2021-02-24 12:59:18

A. 誰能提供給我weblogic上跑jaas的實例

這有個 jaas tomcat的實例, 先看下吧:
准備文件和目錄
創建文件login.jsp和error.jsp
login.jsp的內容
<html>
<head>
<meta HTTP-EQUIV="Content-Type" Content="text-html; charset=gbk">
<title>login</title>
</head>
<body>
<form method="POST" action="j_security_check">
姓名:<input type="text" name="j_username"/>
<br/>
密碼:<input type="password" name="j_password"/>
<br/>
<input type="submit" value="提交"/>
</form>
</body>
</html>

在根目錄下創建目錄web,在新建的目錄下創建一個文件index.jsp,內容如下
<html>
<head>
<meta http-equiv="Content-Type"
content="text/html; charset=GBK">
<title>Apache-Axis</title>
</head>
<body bgcolor="#FFFFFF">
request.FORM_AUTH:<%=request.FORM_AUTH%><br/>
request.getRemoteUser():<%=request.getRemoteUser()%><br/>
</body>
</html>

設置配置文件
在web.xml中添加以下內容
<web-app>
...
<security-constraint>
<!-- Sample Security Constraint -->
<web-resource-collection>
<!-- We're going to protect this resource and make it available only to users in "role1". -->
<web-resource-name>protected-resources</web-resource-name>
<url-pattern>/web/*</url-pattern>
<http-method>HEAD</http-method>
<http-method>GET</http-method>
<http-method>POST</http-method>
<http-method>PUT</http-method>
<http-method>DELETE</http-method>
</web-resource-collection>
<!-- NOTE: This role names will be retrieved by Josso using the propper identity store. -->
<auth-constraint>
<role-name>role1</role-name>
</auth-constraint>
<user-data-constraint>
<transport-guarantee>NONE</transport-guarantee>
</user-data-constraint>
</security-constraint>

<login-config>
<auth-method>FORM</auth-method>
<form-login-config>
<form-login-page>/login.jsp</form-login-page>
<form-error-page>/error.jsp</form-error-page>
</form-login-config>
</login-config>

<security-role >
<description>Role 1</description>
<role-name>role1</role-name>
</security-role>
</web-app>
測試
打開tomcat目錄下的conf/tomcat-users.xml文件,內容如下
<?xml version='1.0' encoding='utf-8'?>
<tomcat-users>
<role rolename="tomcat"/>
<role rolename="role1"/>
<user username="tomcat" password="tomcat" roles="tomcat"/>
<user username="role1" password="tomcat" roles="role1"/>
<user username="both" password="tomcat" roles="tomcat,role1"/>
</tomcat-users>

啟動tomcat,在瀏覽器中輸入地址http://localhost:8080/hello/web/,顯示的內容不是/web/index.html,而是login.jsp的內容,輸入both或者role1的用戶名和密碼,將會看到web/index.html的內容,當然,如果輸入錯誤,則會提示錯誤信息。驗證通過後,我們可以看到如下內容:
request.FORM_AUTH:FORM
request.getRemoteUser():both? //用戶名

sun公司也有提供了一個關於JAAS的實例,可供實際分析JAAS使用原理,本人在網上找了許久這方面的文章,希望對你有幫助。

1、首先下載實例代碼

http://java.sun.com/j2se/1.4.2/docs/guide/security/jaas/tutorials/sample_jaas.config
http://java.sun.com/j2se/1.4.2/docs/guide/security/jaas/tutorials/SampleAcn.java
http://java.sun.com/j2se/1.4.2/docs/guide/security/jaas/tutorials/SampleLoginMole.java
http://java.sun.com/j2se/1.4.2/docs/guide/security/jaas/tutorials/SamplePrincipal.java
http://java.sun.com/j2se/1.4.2/docs/guide/security/jaas/tutorials/sampleacn.policy

2、SampleAcn.java 放在 sample 目錄中, SampleLoginMole.java 放在 sample/mole 之下, 而 SamplePricipal 放在 sample/principal 之下。

3、將 config 和 policy 配置文件放到項目的根目錄中,切記,否則無法找到此文件。

4、將所有文件編譯後執行以下命令

java -Djava.security.auth.login.config==sample_jaas.config sample.SampleAcn

如果使用Eclipse則在Run... SampleAcn.java 類時把-Djava.security.auth.login.config==sample_jaas.config 參數填寫入Arguments標簽頁面的VM arguments框中。

5、此時在控制台顯示要求用戶輸入user name:和password:,分別輸入testUser和testPassword即可驗證通過。

至於Jaas原理,有時間可以研究一下源代碼即可。

B. J2EE是什麼意思啊

j2ee 也叫 javaee 是企業標准版主要用於網頁後台一些邏輯判斷數據傳輸。Java EE 是 J2EE的一個新的名稱,之所以改名,目的還是讓大家清楚J2EE只是Java企業應用。

在2004年底中國軟體技術大會Ioc微容器(也就是Jdon框架的實現原理)演講中指出:

我們需要一個跨J2SE/WEB/EJB的微容器,保護我們的業務核心組件(中間件),以延續它的生命力,而不是依賴J2SE/J2EE版本。

(2)jaas授權類擴展閱讀:

核心優勢:

J2EE容易讓初學者誤解是獨立於一套Java的技術方案。

從更深層次來看,Java誕生十年,多年前的業務組件還可以使用,軟體應用不再由於語言的更迭革命帶來毀滅的打擊了。

當然,Java EE 5重要改變還是:Java EE不再象以前那樣只注重大型商業系統的開發,而是更關注小到中型系統的開發,簡化這部分系統開發步驟。

落實這一簡化行動的最大特徵是在Java 5.0(Java 1.5)中加入Annotations,通過Annotations引入,降低Java EE開發時,既要寫code,又要寫XML配置文件之苦。

來回照顧,疲於奔命,Annotations既是得益於C++語言,也是從開源項目xDoclet實踐中獲得經驗。

但是Annotations是一把雙刃劍,初學者用得不好,將會使得原本在XML中的Hard code(硬編碼) 寫進入代碼Annotations,破壞代碼的簡潔和靈活性,

當然,Annotations的引入不只是解決XML配置,從大的概念說,是解決一個資源注射問題(XML屬於其中一個資源),在原理J2EE中,容器管理的資源都是由JNDI向應用程序提供的,通過Annotations可以方便實現注射。

C. 如何利用JAAS實現一個認證授權的例子

Kerberos已經配置完成。

在java測試程序中設置Kerberos的相關屬性
Properties props = new Properties();
props.load(new FileInputStream("client.properties"));
System.setProperty("sun.security.krb5.debug", "true");
System.setProperty("java.security.krb5.realm",
props.getProperty("realm"));
System.setProperty("java.security.krb5.kdc",
props.getProperty("kdc"));
client.properties具體內容如下所示:

設置登錄Kerberos使用的配置文件和用到的用戶名和密碼
System.setProperty("java.security.auth.login.config", "./jaas.conf");
System.setProperty("javax.security.auth.useSubjectCredsOnly",
"false");
String username = props.getProperty("client.principal.name");
String password = props.getProperty("client.password");
jaas.conf配置文件如下所示:主要看此文件Client備份配置內容,可以看到jaas登錄使用的是Krb5LoginMole模式

使用LoginContext類完成認證。此時的關鍵參數為用戶名和密碼。

使用LoginContext類進行認證時,調用了回調類LoginCallbackHandler。此類主要是對用戶名和密碼的處理。

認證通過後獲取一個subject。獲取subject後就可通過此授權進行相關操作了。

D. jaas授權類中,不包含以下哪一類

Windows XP用戶帳戶來管理與許可權設置自 1:標准用戶 該用戶可修改大部分計算機設制,安裝不修改操作系統文件且不需要安裝系統服務的應用程序,創建和管理本地用戶帳戶和組,啟動或停止默認情況下不啟動 的服務,但不可訪問NTFS分區上屬於其他用戶的私有文...

E. jaas幹嘛的

Java Authentication Authorization Service(JAAS,Java驗證和授權API)提供了靈活和可伸縮的機制來保證客戶端或伺服器端的Java程序內。Java早期的安全框架強調的是通過驗容證代碼的來源和作者,保護用戶避免受到下載下來的代碼的攻擊。JAAS強調的是通過驗證誰在運行代碼以及他/她的許可權來保護系統面受用戶的攻擊。它讓你能夠將一些標準的安全機制,例如Solaris NIS(網路信息服務)、Windows NT、LDAP(輕量目錄存取協議),Kerberos等通過一種通用的,可配置的方式集成到系統中。

F. 什麼是JAAS以及靈活的Java安全機制

JAAS:是通過驗證誰 Java Authentication Authorization Service(JAAS,Java驗證和授權API)提供靈活和可伸縮的機制來保證回客戶端或服答務器端的Java程序。JAAS強調的是通過驗證誰在運行代碼以及他/她的許可權來保護系統面受用戶的攻擊。
Java的安全模式包括3層:Java語言本身,java編譯器和run-time系統,SecurityManager類。
在語言層,java以不同的方式來實現它的安全性,什麼原始類型的大小,對象的指針和偽訪問將不再唄允許,數組辯解檢查等待。
在java編譯器和run-time系統安全層提供了必要的功能,以確保java系統不會因無效代碼而崩潰,它提供了一個簡單的由一下三個子層所組成的安全的運行環境:
1:java位元組代碼解釋器和類格式檢驗
2:一個在運行時動態裝載和檢查庫的機制
3:自動的垃圾回收機制、

G. 什麼是JAAS,以及靈活的Java安全

Java Authentication Authorization Service(JAAS,Java驗證和授權)提供了靈活和可伸縮的機制來保證客戶端或伺服器端的Java程序。Java早期的安全框架強調的是通過驗證代碼的來源和作者,保護用戶避免受到下載下來的代碼的攻擊。JAAS強調的是通過驗證誰在運行代碼以及他/她的許可權來保護系統面受用戶的攻擊。它讓你能夠將一些標準的安全機制,例如Solaris NIS(網路信息服務)、Windows NT、LDAP(輕量目錄存取協議),Kerberos等通過一種通用的,可配置的方式集成到系統中。
你是否曾經需要為一個應用程序實現登錄模塊呢?如果你是一個比較有經驗的程序員,相信你這樣的工作做過很多次,而且每次都不完全一樣。你有可能把你的登錄模塊建立在Oracle資料庫的基礎上,也有可能使用的是NT的用戶驗證,或者使用的是LDAP目錄。如果有一種方法可以在不改變應用程序級的代碼的基礎上支持上面提到的所有這一些安全機制,對於程序員來說一定是一件幸運的事。
現在你可以使用JAAS實現上面的目標。JAAS是一個比較新的的Java API。在J2SE 1.3中,它是一個擴展包;在J2SE 1.4中變成了一個核心包。在本文中,我們將介紹JAAS的一些核心概念,然後通過例子說明如何將JAAS應用到實際的程序中。本文的例子是根據我們一個基於Web的Java應用程序進行改編的,在這個例子中,我們使用了關系資料庫保存用戶的登錄信息。由於使用了JAAS,我們實現了一個健壯而靈活的登錄和身份驗證模塊。
客戶端和伺服器端的JAAS
開發人員可以將JAAS應用到客戶端和伺服器端。在客戶端使用JAAS很簡單。在伺服器端使用JAAS時情況要復雜一些。目前在應用伺服器市場中的JAAS產品還不是很一致,使用JAAS的J2EE應用伺服器有一些細微的差別。例如JBossSx使用自己的結構,將JAAS集成到了一個更大的安全框架中;而雖然WebLogic 6.x也使用了JAAS,安全框架卻完全不一樣。
現在你能夠理解為什麼我們需要從客戶端和伺服器端的角度來看JAAS了。我們將在後面列出兩種情況下的例子。為了使伺服器端的例子程序更加簡單,我們使用了Resin應用伺服器。
核心JAAS類
在使用JAAS之前,你首先需要安裝JAAS。在J2SE 1.4中已經包括了JAAS,但是在J2SE 1.3中沒有。如果你希望使用J2SE 1.3,你可以從SUN的官方站點上下載JAAS。當正確安裝了JAAS後,你會在安裝目錄的lib目錄下找到jaas.jar。你需要將該路徑加入Classpath中。(註:如果你安裝了應用伺服器,其中就已經包括了JAAS,請閱讀應用伺服器的幫助文檔以獲得更詳細的信息)。在Java安全屬性文件java.security中,你可以改變一些與JAAS相關的系統屬性。該文件保存在/lib/security目錄中。
在應用程序中使用JAAS驗證通常會涉及到以下幾個步驟:
1. 創建一個LoginContext的實例。
2. 為了能夠獲得和處理驗證信息,將一個CallBackHandler對象作為參數傳送給LoginContext。
3. 通過調用LoginContext的login()方法來進行驗證。
4. 通過使用login()方法返回的Subject對象實現一些特殊的功能(假設登錄成功)。
下面是一個簡單的例子:
LoginContext lc = new LoginContext("MyExample");
try {
lc.login();
} catch (LoginException) {
// Authentication failed.
}
// Authentication successful, we can now continue.
// We can use the returned Subject if we like.
Subject sub = lc.getSubject();
Subject.doAs(sub, new MyPrivilegedAction());
在運行這段代碼時,後台進行了以下的工作。
1. 當初始化時,LoginContext對象首先在JAAS配置文件中找到MyExample項,然後更具該項的內容決定該載入哪個LoginMole對象。
2. 在登錄時,LoginContext對象調用每個LoginMole對象的login()方法。
3. 每個login()方法進行驗證操作或獲得一個CallbackHandle對象。
4. CallbackHandle對象通過使用一個或多個CallBack方法同用戶進行交互,獲得用戶輸入。
5. 向一個新的Subject對象中填入驗證信息。
我們將對代碼作進一步的解釋。但是在這之前,讓我們先看代碼中涉及到的核心JAAS類和介面。這些類可以被分為三種類型:
普通類型 Subject,Principal,憑證
驗證 LoginContext,LoginMole,CallBackHandler,Callback
授權 Policy,AuthPermission,PrivateCredentialPermission
上面列舉的類和介面大多數都在javax.security.auth包中。在J2SE 1.4中,還有一些介面的實現類在com.sun.security.auth包中。
普通類型:Subject,Principal,憑證 Subject類代表了一個驗證實體,它可以是用戶、管理員、Web服務,設備或者其他的過程。該類包含了三中類型的安全信息: 身份(Identities):由一個或多個Principal對象表示 公共憑證(Public credentials):例如名稱或公共秘鑰 私有憑證(Private credentials):例如口令或私有密鑰 Principal對象代表了Subject對象的身份。它們實現了java.security.Principal和java.io.Serializable介面。在Subject類中,最重要的方法是getName()。該方法返回一個身份名稱。在Subject對象中包含了多個Principal對象,因此它可以擁有多個名稱。由於登錄名稱、身份證號和Email地址都可以作為用戶的身份標識,可見擁有多個身份名稱的情況在實際應用中是非常普遍的情況。 在上面提到的憑證並不是一個特定的類或借口,它可以是任何對象。憑證中可以包含任何特定安全系統需要的驗證信息,例如標簽(ticket),密鑰或口令。Subject對象中維護著一組特定的私有和公有的憑證,這些憑證可以通過getPrivateCredentials()和getPublicCredentials()方法獲得。這些方法通常在應用程序層中的安全子系統被調用。 驗證:LoginContext 在應用程序層中,你可以使用LoginContext對象來驗證Subject對象。LoginContext對象同時體現了JAAS的動態可插入性(Dynamic Pluggability),因為當你創建一個LoginContext的實例時,你需要指定一個配置。LoginContext通常從一個文本文件中載入配置信息,這些配置信息告訴LoginContext對象在登錄時使用哪一個LoginMole對象。 下面列出了在LoginContext中經常使用的三個方法: login () 進行登錄操作。該方法激活了配置中制定的所有LoginMole對象。如果成功,它將創建一個經過了驗證的Subject對象;否則拋出LoginException異常。 getSubject () 返回經過驗證的Subject對象 logout () 注銷Subject對象,刪除與之相關的Principal對象和憑證 驗證:LoginMole LoginMole是調用特定驗證機制的介面。J2EE 1.4中包含了下面幾種LoginMole的實現類: JndiLoginMole 用於驗證在JNDI中配置的目錄服務 Krb5LoginMole 使用Kerberos協議進行驗證 NTLoginMol 使用當前用戶在NT中的用戶信息進行驗證 UnixLoginMole 使用當前用戶在Unix中的用戶信息進行驗證 同上面這些模塊綁定在一起的還有對應的Principal介面的實現類,例如NTDomainPrincipal和UnixPrincipal。這些類在com.sun.security.auth包中。 LoginMole介面中包含了五個方法: initialize () 當創建一LoginMole實例時會被構造函數調用 login () 進行驗證 commit () 當LgoninContext對象接受所有LoginMole對象傳回的結果後將調用該方法。該方法將Principal對象和憑證賦給Subject對象。 abort () 當任何一個LoginMole對象驗證失敗時都會調用該方法。此時沒有任何Principal對象或憑證關聯到Subject對象上。 logout () 刪除與Subject對象關聯的Principal對象和憑證。 在應用程序的代碼中,程序員通常不會直接調用上面列出的方法,而是通過LigonContext間接調用這些方法。 驗證:CallbackHandler和Callback CallbackHandler和Callback對象可以使LoginMole對象從系統和用戶那裡收集必要的驗證信息,同時獨立於實際的收集信息時發生的交互過程。 JAAS在javax.sevurity.auth.callback包中包含了七個Callback的實現類和兩個CallbackHandler的實現類: ChoiceCallback、ConfirmationCallback、LogcaleCallback、NameCallback、PasswordCallback、TextInputCallback、TextOutputCallback、DialogCallbackHandler和TextCallBackHandler。Callback介面只會在客戶端會被使用到。

H. 如何用JAVA實現CA認證

by fleshwound (http://www.smatrix.org)
(註:這是我們的完整設計中的一部分,其它有些部分尚要求保密,希望這個拙文能給做J2EE項目的兄弟們帶來點幫助,有任何關於JAVA安全和密碼學理論和應用的問題可以來我們的論壇:http://bbs.smatrix.org)
近年來,隨著互連網和計算機的普及,電子商務和電子政務成為當今社會生活的重要組成部分,以網上訂購和網上在線支付的為主要功能的網店系統(Web Shop System)是目前電子商務的熱門技術。
JAVA以它「一次編譯,處處運行」的神奇魅力和強大的安全技術支持,很快成為WEB信息系統開發的首選語言,而J2EE就是為了WEB應用開發而誕生的。目前J2EE的應用大部份都是多層結構的, 良好的分層可以帶來很多好處,例如可以使得代碼結構清晰,方便組件復用,可以快速適應應用的新需求。同時,JAVA還提供了強大的安全技術(例如:JCA,HTTPS,JSSA等)。對於電子商務系統而言,系統平台的安全性和效率是其中的核心問題,而這些正好是J2EE及其相關技術的強項。

0 系統中所要使用的API及其特點介紹
該系統中主要使用的技術和特點如下:
(1)EJB :主要是作為J2EE中間層,完成商業邏輯。目前主要有三種類型的EJB: 會話 Bean (Session Bean)、實體Bean (Entity Bean)、消息驅動的Bean(MDB);
(2)JAAS:在J2EE 中用於處理認證和授權服務,進行資源控制;
(3)JSP和Java Servlets:用於J2EE的表示層,生成用戶界面;
(4)JDBC:用於資料庫(資源層)的連接和與資料庫進行交互;
(5)JNDI:Java命名和目錄介面,該API實際上是用來訪問J2EE的所有資源;
(6)JMS:Java消息傳輸服務,配合MDB使用。

1 Session的安全問題與解決方案
在項目中,保存Session一般有兩種方法,一是分別放在客戶端,一是集中放在伺服器端。在客戶端保存Session是指將Session的狀態串列化,然後嵌入到返回給客戶的HTML頁面中。當Session中的信息很少時,這樣實現比較容易,另外這種方法還消除了跨越多個伺服器復制狀態的問題。
但是在客戶端保存Session狀態時,必須考慮到由此帶來的安全問題,因為黑客可能通過嗅探攻擊(Sniffer)獲取敏感信息。為了不讓敏感信息數據暴露,解決的方法是對數據進行加密或者使用HTTPS,採用SSL技術。
如果是要保存大量Session狀態的應用,最好的方法是將Session狀態統一放在伺服器端。當狀態被保存在伺服器上時,不會有客戶端Session管理的大小和類型限制。此外,還避免了由此帶來的安全問題,而且也不會遇到由於在每個請求間傳送Session狀態帶來的性能影響,但是對伺服器的性能要求比較高。網店系統的安全性要求較高,因此Session還是集中放在中間層伺服器端,同時對客戶端到伺服器端採用SSL連接。
2客戶端的緩存安全設計
大部分顧客使用的WEB瀏覽器將瀏覽過的頁面緩存在磁碟上,這樣我們瀏覽網頁的時候不需要重新向伺服器發出HTTP請求,對於普通的網頁不存在安全問題。但是對於需要保密的WEB應用,會帶來安全隱患和泄漏隱私,因此對於客戶端緩存,也必須做適當的處理。最好的方法就是禁止使用緩存,但是對於大部分顧客而言,要求在客戶端不用緩存是不現實的,因此我們必須在中間層解決該問題,方法是採用Servlet過濾器技術。該技術是Servlet2.3以後才出現的,在J2EE中的應用很廣泛。要使用該技術,需要執行以下步驟:
(1) 編寫一個Servlet過濾器,實現javax.servlet.Filter介面;
(2) 修改Web.xml文件,使容器知道過濾器在什麼時候被調用。
Javax.servlet.Filter主要有3個方法:
(1)init(FilterConfig cfg) :當開始使用 servlet 過濾器服務時,容器調用此方法一次。傳送給此方法的 FilterConfig 參數包含 servlet 過濾器的初始化參數;
(2)destroy() :當不再使用 servlet 過濾器服務時,容器調用此方法;
(3)doFilter(ServletRequest req, ServletResponse res, FilterChain chain): 容器為每個映射至此過濾器的 servlet 請求調用此方法,然後才調用該 servlet 本身。傳送至此方法的 FilterChain 參數可用來調用過濾器鏈中的下一個過濾器。當鏈中的最後一個過濾器調用 chain.doFilter() 方法時,將運行最初請求的 servlet。因此,所有過濾器都應該調用 chain.doFilter() 方法。如果過濾器代碼中的附加認證檢查導致故障,則不需要將原始 servlet 實例化。在這種情況下,不需要調用 chain.doFilter() 方法,相反,可將其重定向至其它一些錯誤頁面。
如果 servlet 映射至許多 servlet 過濾器,則按照應用程序的部署描述符(web.xml)中的先後出現的次序來調用 servlet 過濾器。這一部分的主要代碼如下:
//要引入的類庫
import javax.servlet.*;
import javax.servlet.http.HttpServletResponse;
import java.io.*;
import java.security.*;
//設置servlet過濾代碼段
public class CacheFilter implements Filter {
protected FilterConfig filterConfig;
private String cachetp;
//初始化
public void init(FilterConfig filterConfig) throws ServletException
{
this.filterConfig = filterConfig;
cachetp=config.getInitParameter("CacheControlType");
if (cachetp==null)
{
throw new ServletException("沒有定義Cache控制類型");
}
}
//
public void destroy()
{
this.filterConfig = null;
}
//執行過濾器部分
public void doFilter(ServletRequest request,ServletResponse response,FilterChain chain)
throws IOException, ServletException {
if (response instanceof HttpServletResponse )
{
HttpServletResponse resp=(HttpServletResponse) response;
resp.addHeader("Cache-Control",cachetp);
}
else
{
throw new ServletException("非法相應!");
}
chain.doFilter(request, response);
}

}
以下是在Web.xml中添加的對應的內容

CacheFilter
CacheFilter
Cache filter

CacheControlType
no-store

CacheFilter
/cachecontrol

3視圖訪問的安全設置
所有用戶都必須登陸,只有登陸才可以看到用戶的角色和許可權相對應的視圖。因此一個重要的問題就是如何防止一個視圖或者部分的視圖被一個未被授權的客戶直接訪問。
在一些情況下,資源被限制為完全不允許某些用戶訪問,例如:管理後台就不應該讓普通顧客會員訪問。有幾個方法可以做到這一點。一個方法是加入應用邏輯到處理控制器或者視圖的程序中,禁止某些用戶訪問。另一個方案是設置運行時的系統,對於一些資源,僅允許經由另一個應用資源內部調用。在這種情形,對於這些資源的訪問必須被通過另一個表現層的應用資源進行,例如一個servlet控制器。對於這些受限制的資源不允許通過瀏覽器直接調用。
在J2EE中,可以利用Web容器中內置的安全技術來進行角色訪問資源的控制。根據最新版本的servlet和EJB規范,安全限制在web.xml的配置描述文件中描述,我們可以通過配置web.xml來控制角色訪問,修改配置描述文件web.xml就可以達到快速修改安全策略的目的。
安全限制允許使用編程的方法根據用戶的角色來控制訪問。資源可以被某些角色的用戶訪問,同時禁止其它的角色訪問。另外,某個視圖的一部分也可以根據用戶的角色來限制其訪問。如果某些資源完全不允許來自於瀏覽器的直接訪問,那麼這些資源可以配置只允許一些特殊的安全形色訪問,而這些安全形色不分配給任何一個用戶。這樣只要不分配這個安全形色,那麼以這種方式配置的資源將禁止所有的瀏覽器直接訪問。下面一個例子就是web.xml配置文件的一部分,它定義了一個安全的角色以限制直接的瀏覽器訪問。角色的名字是「vip」,受限制資源的名字是specialgood1.jsp、specialgood2.jsp、specialgood3.jsp和bookinfo.jsp。除非一個用戶或者組被分配到「vip」角色,否則這些客戶都不可以直接訪問這些JSP頁面。不過,由於內部的請求並不受這些安全的限制,一個初始時由某servlet控制器處理的請求將會導向到這些受限制的頁面,這樣它們就可以間接訪問這些JSP頁面。
<security-constraint>
<web-resource-collection>
<web-resource-name>specialgood </web-resource-name>
<description>special good infomation</description>
<url-pattern>/shop/jsp/a1/specialgood1.jsp</url-pattern>
<url-pattern>/shop/jsp/a1/specialgood2.jsp</url-pattern>
<url-pattern>/shop/jsp/a1/specialgood3.jsp</url-pattern>
<url-pattern>/shop/jsp/a1/bookinfo.jsp</url-pattern>
<http-method>GET</http-method>
<http-method>POST</http-method>
</web-resource-collection>
<auth-constraint>
<role-name>vip</role-name>
</auth-constraint>
</security-constraint>
3 各層次間的耦合問題與解決策略
表現層的數據結構,例如HttpServletRequest,應該被限制在表現層上。如果將這些細節放到其它層(主要是業務邏輯層)中,將大大降低了代碼的的重用性,令代碼變得復雜,並且增加了層間的耦合。解決方法一個常用方法是不讓表現層的數據結構和商業層共享,而是拷貝相關的狀態到一個更常見的數據結構中再共享。你也可以選擇由表現層數據結構中將相關的狀態分離出來,作為獨立的參數共享。另外在域對象暴露表現層的數據結構,如果將諸如HttpServletRequest的請求處理數據結構和域對象共享,這樣做也會增加了應用中兩個不同方面的耦合。域對象應該是可重用的組件,如果它們的實現依賴協議或者層相關的細節,它們可重用性就很差,同時維護和調試高耦合的應用更加困難。成熟的解決方案是不通過傳送一個HttpServletRequest對象作為一個參數,而是拷貝request對象的狀態到一個更為常用的數據結構中,並且將這個對象共享給域對象。你也可以選擇由HttpServletRequest對象中將相關的狀態分離出來,並且將每一個的狀態作為一個獨立的參數提供給域對象。
4 EJB的安全設計與控制
EJB的執行過程一般是這樣的:(1)客戶端通過JNDI檢索Home對象的引用;(2)JNDI返回Home對象的引用;(3)請求創建一個新的EJB對象;(4)創建EJB對象;(5)返回EJB對象;(6)調用商務方法;(7)調用Enterprise Bean.引起EJB的安全問題原因主要存在三個方面:
(1)用包嗅探器(Packet Sniffer)獲取用戶憑證信息並直接調用會話Bean;(2)對實體Bean進行未授權訪問;(3)對消息驅動的Bean的無效訪問(發布惡意或者虛假的消息).
以上安全問題可導致客戶端或者服務端欺騙攻擊和DDOS攻擊。解決問題(1)的方法是使用JAVA中SSL技術來保護通訊,解決(2)的方法是對於實體Bean全部採用本地介面或者採用JAAS(文獻[1]),對於(1)和(2),我們可以同時採取以下措施:讓容器完成認證並傳輸用戶憑證信息,另外使用聲明性或者程序設計的安全驗證角色。對於問題(3),J2EE並沒有提供一個很好的方案,我們的解決方案是採用數字簽名技術來保證信息來自可信任的源。該方法的結合代碼簡要說明如下,消息採用JMS傳遞:
//客戶端,要用到消息發送者的私鑰進行簽名
...
message.setString("userid",userid);
message.setString("useritem",useritem);
message.setInt("usersn",serialnum);//包含一個序列號
message.setString("usercertid",certid);
String signature=getSignature(userid+":"+useritem+":"+serialnum+":"+certid);
//進行簽名,其中getSignature為簽名函數,要用到消息發送者的私鑰進行簽名,具體密碼學技術可參考文獻[2];
message.setString("signature",signature);
sendmessage(message);//發送信息
...
//伺服器端
String checkstr=userid+":"+message.getString("useritem")+":"+
message.getInt("usersn")+":"+usercertid;
boolean b_check=checkSignature(checkstr,msg.getString("signature"),
usercertid,userid);
//進行驗證,其中checkSignature為驗證函數,要用到消息發送者的公鑰進行驗證,具體密碼學技術可參考文獻[2];
5 CA中心與證書的生成
前面我們已經提出在客戶端要使用HTTPS和SSL,因此要建立一個自己的CA中心來管理分發證書,加強客戶端到中間層伺服器端通訊的安全性.建立CA中心的第一步是利用JAVA工具包中的Keytool生成一個X509證書,然後將該證書交由權威CA中心Vertsign簽名,再將該證書設置為根證書,建立自己的CA.每次有新用戶注冊交易的時候,都必須簽發一個用戶獨一無二的證書,關鍵的過程是如何簽發證書.簽發證書的過程如下:
(1)從中間層CA伺服器的密鑰庫中讀取CA的證書:
FileInputStream in=new FileInputStream(ShopCAstorename);
KeyStore ks=KeyStore.getInstance("JKS");
ks.load(in,storepass);
java.security.cert.Certificate c1=ks.getCertificate(alias);
(2)獲得CA的私鑰:
PrivateKey caprk=(PrivateKey)ks.getKey(alias,cakeypass);
(3)從CA的證書中提取簽發者信息:
byte[] encod1=c1.getEncoded();
X509CertImpl shopcimp1=new X509CertImpl(encod1);
X509CertInfo shopcinfo1=(X509CertInfo)shopcimp1.get(X509CertImpl.NAME+
"."+X509CertImpl.INFO);
X500Name issuer=(X500Name)shopcinfo1.get(X509CertInfo.SUBJECT+
"."+CertificateIssuerName.DN_NAME);
(4)獲取待簽發的證書相關信息,與(3)類似;
(5)設置新證書的有效期、序列號、簽發者和簽名演算法:
//設置新證書有效期為1年
Date begindate =new Date();
Date enddate =new Date(begindate.getTime()+3000*24*360*60*1000L); CertificateValidity cv=new CertificateValidity(begindate,enddate);
cinfo2.set(X509CertInfo.VALIDITY,cv);
//設置新證書序列號
int sn=(int)(begindate.getTime()/1000);
CertificateSerialNumber csn=new CertificateSerialNumber(sn);
cinfo2.set(X509CertInfo.SERIAL_NUMBER,csn);
//設置新證書簽發者
cinfo2.set(X509CertInfo.ISSUER+"."+
CertificateIssuerName.DN_NAME,issuer);
//設置新證書演算法
AlgorithmId algorithm =
new AlgorithmId(AlgorithmId.md5WithRSAEncryption_oid);
cinfo2.set(CertificateAlgorithmId.NAME+
"."+CertificateAlgorithmId.ALGORITHM, algorithm);
(6)創建證書並簽發:
// 創建證書
X509CertImpl newcert=new X509CertImpl(cinfo2);
// 簽名
newcert.sign(caprk,"MD5WithRSA");
(7)將新證書提供給注冊用戶,並提示安裝,一般的做法是在用戶注冊成功後系統立即返回一個證書對象給中間層某個Servlet,由其返回給用戶。
參考文獻
[1]沈耀,陳昊鵬,李新顏.EJB容器中基於JAAS 的安全機制的實現.[J]:計算機應用與軟體 2004.9 16~18
[2](美)Jess Garms著,龐南等譯. Java安全性編程指南[M].北京:電子工業出版社 2002
[3] http://java.sun.com/j2ee/
[4] 蔡劍,景楠. Java 網路程序設計:J2EE(含1.4最新功能)[M].北京: 清華大學出版社 2003
[5](美)John Bell Tony Loton. Java Servlets 2.3編程指南[M].北京: 電子工業出版社 2002
[6](美)Joseph J.Bambara等著,劉堃等譯. J2EE技術內幕[M].北京:機械工業出版社 2002
[7](美)Li Gong著.JAVA 2平台安全技術——結構、API設計和實現[M].北京: 機械工業出版社 2000
[8](英)Danny Ayers等著,曾國平等譯. Java伺服器高級編程[M].北京:機械工業出版社 2005
[9]http://www.smatrix.org/bbs
[10]http://www.smatrix.cn/bbs

I. java授權文件的實現機制是什麼

看 「java.io.File」 的一個 createNewFile 方法。
它先檢查許可權,然後才開始執行操作。
這個授權的配置是通過命令行參數 java.exe -Djava.security.policy=aaa.policy 來啟用的。這裡面應該包括關於 File 的許可權才能讓這段代碼工作,否則得到的是 PermissionException。
編寫許可權 policy 文件的話可以使用 %JDK%/bin/policytool.exe。

從這個代碼中看來,如果你也希望提供自己的許可權類型,你也可以這么在代碼中寫上。不過基本上如果這個代碼本身沒有先檢查許可權的話,這種授權也無法實現。

public boolean createNewFile() throws IOException {
SecurityManager security = System.getSecurityManager();
if (security != null) security.checkWrite(path);
return fs.createFileExclusively(path);
}

上面這種授權相當於授與某個程序的。而不區分當前調用程序的人是誰。JAAS 這種則是為了解決「向誰就某事授權」的問題。一般我們登錄是用 JAAS 這種授權,它能區分出「誰」和「某件事」。

熱點內容
美發店認證 發布:2021-03-16 21:43:38 瀏覽:443
物業糾紛原因 發布:2021-03-16 21:42:46 瀏覽:474
全國著名不孕不育醫院 發布:2021-03-16 21:42:24 瀏覽:679
知名明星確診 發布:2021-03-16 21:42:04 瀏覽:14
ipad大專有用嗎 發布:2021-03-16 21:40:58 瀏覽:670
公務員協議班值得嗎 發布:2021-03-16 21:40:00 瀏覽:21
知名書店品牌 發布:2021-03-16 21:39:09 瀏覽:949
q雷授權碼在哪裡買 發布:2021-03-16 21:38:44 瀏覽:852
圖書天貓轉讓 發布:2021-03-16 21:38:26 瀏覽:707
寶寶水杯品牌 發布:2021-03-16 21:35:56 瀏覽:837