配置JBoss如何從數據庫里讀取信息
在我的項目一開始的時候由于時間關系,沒能摸清楚如何實現用自己寫的模塊處理登錄,所以就采用了比較簡單RDBMS(即用JBoss的 DatabaseServerLoginModule)模塊處理登錄事件,然后通過一個過濾器判斷用戶是否已經登錄,如果登錄了再從數據庫中讀取用戶信息到session中。雖然自己都感覺到有點不倫不類,但我還是將我的具體實現方式在下面寫出來:
1.配置login-config.xml
編輯JBoss主目錄下的 server/default/conf 目錄下的login-config.xml文件,在<policy>節點下加入如下的內容:
- <policy>
- ….
- <application-policy name = "nccnm">
- <authentication>
- <login-module code = "org.jboss.security.auth.spi. DatabaseServerLoginModule" flag = "required">
- <!--配置訪問數據庫的連接池名稱為cnmtestds -->
- <module-option name = "dsJndiName">java:/ testds</module-option>
- <!--配置根據登錄名獲取密碼的sql語句 -->
- <module-option name = "principalsQuery">SELECT PASSWORD FROM OPERATOR WHERE LOGINID=?</module-option>
- <!--配置根據登錄名獲取用戶角色的sql語句 -->
- <module-option name = "rolesQuery">SELECT ROLENAME,'Roles' FROM V_ROLE WHERE LOGINID=?</module-option>
- <!--使用MD5方式加密密碼 -->
- <module-option name="hashAlgorithm">MD5</module-option>
- <!--將加密后的密碼再轉為base64編碼 -->
- <module-option name="hashEncoding">base64</module-option>
- </login-module>
- </authentication>
- </application-policy>
- ….
- </policy>
在這里順便簡單介紹一下MD5和Base64。MD5是一種不可逆的編碼算法,即你不可能由已經加密的密碼字符串來根據固定的算法還原出原來的密碼,據說現在的銀行系統大多數采用這種方式來儲存用戶密碼,所以如果用戶的密碼遺失了,銀行也不可能通過查數據庫給你找回你原來設的密碼,只能重新設置。要破解MD5的密碼只能用很笨很好時的窮舉法。
而Base64的編碼其實大家都應該經常接觸,我們的電子郵件一般都是經過Base64編碼后傳送的,如果您用的是Outlook Express收發郵件,那你可以通過郵件的“屬性/詳細信息/郵件來源”看到郵件的Base64編碼的信息。它將二進制數據編碼為字母和數字,因為字母和數字的個數少于256,所以它是把3個字節的二進制數據轉換為4個字節的字母和數字。所以經過base64編碼的文件會比原來的文件大4/3倍。JBoss用專門的API來處理md5加密及base64的編碼和反編碼。
2.配置連接池
上面的文件中用到了一個名為testds的連接池,現在就來配置這個連接池。我這里用的是oracle數據庫,其它的數據庫的配置方式就不一一介紹了。具體的表結構和建表的sql語句我這里也不再描述了,如果有不清楚的地方清留言問我。
編輯JBoss主目錄下的server\default \deploy目錄 (什么?你的目錄下沒有找到這個文件,沒關系,從你的JBoss主目錄的docs\examples\jca下copy一個過來)。在<datasources>節點之間加入如下內容:
- <local-tx-datasource>
- <jndi-name>testds</jndi-name>
- <connection-url>jdbc:oracle:thin:@127.0.0.1:1521:mydb</connection-url>
- <driver-class>oracle.jdbc.driver.OracleDriver</driver-class>
- <user-name>test</user-name>
- <password>123</password>
- <exception-sorter-class-name>org.jboss.resource.adapter. jdbc.vendor.OracleExceptionSorter</exception-sorter-class-name>
- <metadata>
- <type-mapping>Oracle9i</type-mapping>
- </metadata>
- </local-tx-datasource>
3.配置JBoss-web.xml
配置JBoss就完成了,下面再配置我們的項目里的文件。
打開你的Web應用下的Web目錄下的的WEB-INF目錄,新建一個JBoss-web.xml的文件,在文件中加入如下內容:
- <jboss-web>
- <!-- Uncomment the security-domain to enable security. You will
- need to edit the htmladaptor login configuration to setup the
- login modules used to authentication users.
- -->
- <!-- 下面的nccnm就是在login-config.xml配置的application-policy的名稱 -->
- <security-domain>java:/jaas/ nccnm </security-domain>
- </jboss-web>
這個配置Jboss會告訴我們這個應用的JAAS安全性策略到哪里去找。
4.配置web.xml
打開你的Web應用下的Web目錄下的的WEB-INF目錄,編輯web.xml (這個文件應該能找到吧?如果找不到就麻煩了,從頭去啃J2EE),加入如下的內容:
- <security-constraint>
- <web-resource-collection>
- <web-resource-name>login required</web-resource-name>
- <url-pattern>*.jsp</url-pattern>
- <url-pattern>*.htm</url-pattern>
- <url-pattern>*.html</url-pattern>
- <url-pattern>*.do</url-pattern>
- </web-resource-collection>
- <auth-constraint>
- <role-name>role1</role-name>
- </auth-constraint>
- </security-constraint>
- <login-config>
- <!-- 通過表單方式來提交登錄 -->
- <auth-method>FORM</auth-method>
- <realm-name>mydomain</realm-name>
- <form-login-config>
- <!-- 登錄頁面為login.jsp -->
- <form-login-page>/login.jsp</form-login-page>
- <!--登錄出錯的話轉到error.jsp頁面 -->
- <form-error-page>/error.jsp</form-error-page>
- </form-login-config>
- </login-config>
- <security-role>
- <role-name>role1</role-name>
- </security-role>
以上內容的是配置JBoss,作用是本Web應用下的所有 jsp,htm,html,do為擴展名的資源都要登錄后才能訪問(你可以根據你的需要來設置,通常你可以設置<url-pattern>* </url-pattern>來限制沒有登錄所有的資源都不能訪問),而且只有role1角色的用戶才能訪問。
【編輯推薦】