2010-11-29

Java EE Custom Authentication - j_security_check / j_username / j_password

Java EE 提供了 JSP/Servlet此種 Web Programming Model

在認證/授權 (AA, Authentication & Authorization) 的部分,係透過 Deployment Descriptor 採用宣告式的安全設定(Declarative Security)

然而,在Java EE 的規範當中,儘規範了如何定義角色、如何限制相關的功能(URL)可被何種角色存取

而沒有規範到實際的認證、授權如何進行? 使用者的帳號、密碼、角色 是存在哪裡 ?

實際的使用者資料庫(User Registry)是使用 DB? LDAP? File? OS? 哪一種...

在做 JSP 的 form authentication 時, 我們知道 login 頁面要有一個 form action 為 j_seurity_check, 帳號/密碼欄位名為 j_username、j_password,但是 開發人員不必做任何事情,Java EE Container 即會幫你完成後續的認證/授權相關事宜

實際上,因為Java EE沒有規範Container要如何實作認證授權,所以 每個Container所用的 User Registry可能都不一樣。如,Apache Tomcat 預設就是透過 tomcat-users.xml 這個檔案來儲存使用者的帳號、密碼。

有時候,我們已經有既有的 User Registry 或是 想要自已客製化實作認證/授權時,這時候,就要用到Container 提供的 Custom Registry 機制,來加以客制化。同樣的,因為此段在Java EE沒有規範到,所以是依各Container 的不同,而有不同的作法 (亦即,使用 Custom Registry的Application, 在更換Container時,可能有可攜性的問題要處理,需依新的Container的規定,額外實做Custom Registry的功能)

以 Tomcat 為例,預設是使用 「UserDatabaseRealm」(註: 所謂的Realm, 即用在儲存使用者認證/授權資訊的儲存庫, 即 前述的 User Registry),我們可以在 $CATALINA_BASE/conf/server.xml 此檔案裡,看到相關的宣告:

<resource name="UserDatabase" auth="Container" type="org.apache.catalina.UserDatabase" description="User database that can be updated and saved" factory="org.apache.catalina.users.MemoryUserDatabaseFactory" pathname="conf/tomcat-users.xml">

<realm classname="org.apache.catalina.realm.UserDatabaseRealm" resourcename="UserDatabase">

在Tomcat中,若要自訂其它種User Registry,可以參考官方的說明文件,基本上,它提供了六種管道:

- JDBCRealm
- DataSourceRealm
- JNDIRealm
- UserDatabaseRealm
- MemoryRealm
- JAASRealm

在 WebSphere 中,則是在Container透過 Custom Registry的設定,提供了LDAP、OS 及 自訂三種方法
在使用者自訂Registry的部分,只要實作 com.ibm.websphere.security.UserRegistry 這個介面,並在Container的設定中使用自行實作的 UserRegistry Class 即可~


1 則留言:

匿名 提到...

Have a chest press as an example; the key muscle worked may be the chest, secondary maybe the
triceps.

My blog post Changeable Weight Dumbbells