JAAS在網上的評價度不是很高,你們一致認爲它比較晦澀難用。雖然如此,可是由於咱們開發的項目裏用到了JAAS,因此還不得不研究一下。
所謂JAAS(Java Authentication Authorization Service Java認證與受權服務)就是爲了保證Java代碼的安全執行而分離出來的一個獨立安全模塊。它的一個顯著的優勢就是它被設計成可插入式的,這樣就保證了 應用程序的獨立性。詳細介紹請參看http://baike.baidu.com/view/72676.htm。
我這裏假設你已經初步瞭解JAAS機制,而後我主要介紹其在JBoss裏如何配置,並如何應用在EJB的Stateless Bean上。具體實現請參考附件。
一、編寫一個主角類,即實現Principle接口的類。接着編寫一個角色組類,即實現Group接口的類。寫這兩個類時和不用JBoss時的寫法相同。
二、寫好登陸模塊,即繼承LoginModule接口的類。寫這個類時也不用考慮JBoss的因素。
三、把JAAS配置集成到JBoss裏面去。打開<JBOSS安裝目錄>/server/<default(這裏是JBoss啓動模式對應的文件夾)>/conf/login-config.xml,參照以下格式添加內容:
<!-- Deploy Ejb_JBoss_JaasSecurityDomain -->
<application-policy name="Ejb_JBoss_JaasSecurityDomain">
<authentication>
<login-module code="jaas.MyLoginModule" flag="required"> </login-module>
</authentication>
</application-policy>
而後在項目裏的src/META-INF下新建jboss.xml,參照以下格式填寫內容:
<jboss>
<security-domain>Ejb_JBoss_JaasSecurityDomain</security-domain>
</jboss>
這樣咱們就完成了JAAS在JBoss中的配置。
接下來,討論咱們如何在EJB服務裏使用該JAAS驗證。
一、首先,需寫好一個EJB服務,即Stateless Bean。無需多言。
二、咱們採用註解方式插入JAAS驗證模塊。這裏涉及到的註解有@DeclareRoles、@RolesAllowed、@PermitAll、 @DenyAll、@RunAs,這幾個註釋裏面,@RolesAllowed使用最頻繁。就我測試發現,@DeclareRoles只起聲明做用,就如 VB中聲明基本變量同樣,沒有實際意義。而@PermitAll是容許全部經過驗證的用戶訪問,而@DenyAll還未被支持,尚不能使用。具體使用請參 考J2EE5API。
三、寫客戶端時須要注意:初始化InitialContext的Properties的設置以下:
Properties prop = new Properties();
prop.put(Context.INITIAL_CONTEXT_FACTORY, "org.jboss.security.jndi.JndiLoginInitialContextFactory");
prop.put(Context.URL_PKG_PREFIXES,
"org.jboss.naming:org.jnp.interfaces");
prop.put(Context.PROVIDER_URL, "(1)");
prop.put(Context.SECURITY_PRINCIPAL, "(2)");
prop.put(Context.SECURITY_CREDENTIALS, "(3)");
InitialContext ctx = new InitialContext(prop);
其中,(1)處應填寫JBoss所在服務器的URL,如"localhost:1099";
(2)處對應上面所寫登陸模塊(實現LoginModule接口)中的NameCallback(需在代碼裏添加)的getName()方法;
(3)處對應上面所寫登陸模塊中的PasswordCallback(需在代碼裏添加)的getPassword()方法。
四、使用InitialContext獲得所寫服務,並調用其中的方法。
休息一下,理理思路,你會發現,在JBoss裏使用JAAS並非一件困難的事。安全