JBoss AS 7:自定義登錄模塊

JBoss AS 7很整潔,但是仍然缺少文檔(錯誤消息沒有那么有用)。 這篇文章總結了如何創建自己的兼容JavaEE的登錄模塊,以對部署在JBoss AS上的Web應用程序的用戶進行身份驗證。 提供了一個工作的基本用戶名密碼模塊。

為什么要使用Java EE標準認證? Java EE安全入門

Java EE規范的一部分是針對Web和EE應用程序的安全性,這使得在web.xml中指定聲明性約束成為可能(例如,“角色X是訪問URL“ / protected / *”的資源所必需的)”,并且以編程方式對其進行控制,即驗證用戶是否具有特定角色(請參見HttpServletRequest.isUserInRole )。

其工作方式如下:

  1. 您在web.xml中聲明:
    1. 登錄配置–主要是使用瀏覽器提示(基本)還是自定義登錄表單以及登錄領域的名稱
      • 自定義表單對發布操作和字段(以j_開頭)使用“魔術”值,這些值由服務器攔截并處理
    2. 應用程序中使用的角色(通??常是“用戶”或“管理員”之類的角色)
    3. 訪問特定的URL模式需要什么角色(默認值:無)
    4. 應用程序的某些部分是否需要HTTPS
  2. 您通常通過將其名稱與配置中可用的登錄模塊之一(從簡單的基于文件的用戶列表到LDAP和Kerberos支持的模塊)相關聯,來告訴應用服務器如何針對該登錄領域對用戶進行身份驗證。 您很少需要創建自己的登錄模塊,這是本文的主題。

如果這不是您的新手,那么我強烈建議您閱讀Java EE 5教程–示例:保護Web應用程序 (使用JSP頁面進行基于表單的身份驗證,包括安全性約束規范,使用JAX-WS進行基本身份驗證,保護企業Bean,使用isCallerInRole和getCallerPrincipal方法)。

為什么要打擾?

  • 聲明式安全性與業務代碼完全分離
  • 在Web應用程序與EJB之間傳播安全性信息很容易(在EJB中,您可以通過xml或@RolesAllowed之類的注釋以聲明方式保護完整的bean或特定方法)
  • 切換到其他身份驗證機制(例如LDAP)很容易,并且很可能會支持SSO

自定義登錄模塊實施選項

如果JBoss 提供的現成的登錄模塊(也稱為安全域)(例如UsersRoles,Ldap,Database,Certificate)不足以滿足您的需求,則可以調整其中之一或實現自己的登錄模塊 。 您可以:

  1. 擴展其中一個具體模塊,覆蓋其一種或某些方法以適應您的需求-請參閱f.ex。 如何重寫DatabaseServerLoginModule以指定您自己的存儲密碼加密方式。 這應該是您的主要選擇。
  2. 子類UsernamePasswordLoginModule
  3. 如果需要最大的靈活性和可移植性,請實現javax.security.auth.spi.LoginModule(這是Java EE的一部分,即JAAS ,非常復雜)

JBoss EAP 5 安全指南 12.2。 自定義模塊對基本模塊(AbstractServerLoginModule,UsernamePasswordLoginModule)以及子類或其他任何標準模塊的子類化如何進行了出色的描述,包括對實現/覆蓋的關鍵方法的描述。 您必須閱讀它。 (在這方面,該指南仍然完全適用于JBoss AS7 。)定制的JndiUserAndPass模塊示例 (擴展了UsernamePasswordLoginModule)也值得一讀–它使用模塊選項和JNDI查找。

示例:自定義UsernamePasswordLoginModule子類

請參閱MySimpleUsernamePasswordLoginModule的源代碼,該源代碼擴展了JBoss的UsernamePasswordLoginModule

抽象的UsernamePasswordLoginModule ( 源代碼 )通過比較用戶提供的相等性密碼與從子類實現的getUsersPassword方法返回的密碼進行比較。 您可以使用方法getUsername獲取嘗試登錄的用戶的用戶名。

實現抽象方法

getUsersPassword()

實現getUsersPassword()可以在任何地方查找用戶密碼。 如果您不以純文本格式存儲密碼,請閱讀下面的其他方法來自定義行為

getRoleSets()

實現getRoleSets()(來自AbstractServerLoginModule)以返回至少一個名為“ Roles”的組,其中包含分配給用戶的0+個角色,請參見此帖子的源代碼中的實現。 通常,您會在某個地方查找用戶的角色(而不是返回硬編碼的“ user_role”角色)。

(可選)擴展initialize(..)以訪問模塊選項等。

通常,您還需要擴展initialize(Subject subject,CallbackHandler callbackHandler,Map sharedState,Map options) (每次身份驗證嘗試都需要調用),

  • 要獲取通過安全域配置中的<module-option ..>元素聲明的屬性的值– 請參見JBoss 5定制模塊示例
  • 要進行其他初始化,例如通過JNDI查找數據源–請參見DatabaseServerLoginModule

(可選)重寫其他方法以自定義行為

如果您不以純文本形式存儲密碼(明智的選擇!),并且不支持開箱即用的哈希方法,則可以覆蓋createPasswordHash(String username,String password,String摘要選項)來哈希/加密用戶提供的密碼密碼與存儲的密碼進行比較之前。

或者,您可以重寫validatePassword(String inputPassword,String ExpectedPassword)以在比較之前對密碼進行任何轉換,甚至可以進行比相等類型不同的比較。

自定義登錄模塊部署選項

在JBoss AS中,您可以

  1. <JBoss AS 7> / modules /下 ,將登錄模塊類作為獨立模塊獨立于Web應用程序部署在JAR中,以及module.xml –在JBossAS7SecurityCustomLoginModules中進行了介紹
  2. 將登錄模塊類部署為webapp的一部分(不需要module.xml)
    1. 在WEB-INF / lib /中的JAR中
    2. 直接在WEB-INF / classes下

在每種情況下,您都必須在JBoss配置(standalone / configuration / standalone.xml或domain / configuration / domain.xml)中聲明一個對應的安全域:

<security-domain name='form-auth' cache-type='default'><authentication><login-module code='custom.MySimpleUsernamePasswordLoginModule' flag='required'><!--module-option name='exampleProperty' value='exampleValue'/--></login-module></authentication>
</security-domain>

code屬性應包含您的登錄模塊類的完全限定名稱,并且安全域的名稱必須與jboss-web.xml中的聲明匹配:

<?xml version='1.0' encoding='UTF-8'?>
<jboss-web><security-domain>form-auth</security-domain><disable-audit>true</disable-audit>
</jboss-web>

編碼

下載包含自定義登錄模塊MySimpleUsernamePasswordLoginModule 的webapp jboss-custom-login ,并按照README中的部署說明進行操作。

參考: The Holy Java博客上的JCG合作伙伴 Jakub Holy 在JBoss AS 7(及更早版本)中創建自定義登錄模塊 。


翻譯自: https://www.javacodegeeks.com/2012/06/jboss-as-7-custom-login-modules.html

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/372640.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/372640.shtml
英文地址,請注明出處:http://en.pswp.cn/news/372640.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

MySQL安裝步驟及相關問題解決

1. 下載MySQL Server&#xff0c;網址&#xff1a;http://dev.mysql.com/downloads/mysql/ 2. 點擊MySQL5.5.21的安裝文件&#xff0c;出現安裝向導界面&#xff0c;單擊“next”繼續安裝&#xff1a; 3. 選擇接受協議&#xff0c;單擊“next”繼續安裝&#xff1a; 4. 在出現選…

matlab的數學函數,matlab中常見數學函數的使用

matlab中常見數學函數的使用 MATLAB 基本知識 Matlab 的內部常數 pi 圓周率 exp(1) 自然對數的底數 e i 或 j 虛數單位 Inf 或 inf 無窮大 Matlab 的常用內部數學函數 指數函數 exp(x) 以 e 為底數 log(x) 自然對數&#xff0c;即以 e 為底數的對數 log10(x) 常用對數&#xff…

C++中 list與vector的區別

C中 list與vector的區別 引用http://www.cnblogs.com/shijingjing07/p/5587719.html C vector和list的區別 1.vector數據結構vector和數組類似&#xff0c;擁有一段連續的內存空間&#xff0c;并且起始地址不變。因此能高效的進行隨機存取&#xff0c;時間復雜度為o(1);但因為內…

使用Struts 2的查詢網格(無插件)

當將jQuery與struts 2一起使用時&#xff0c;開發人員被說服使用struts2-jQuery插件 。 因為大多數論壇和其他Internet資源都支持struts2 jQuery插件。我有這種經驗。 我想將Struts 2使用jQuery Grid插件&#xff0c;但不使用struts2 jQuery插件。 對于我而言&#xff0c;很難找…

php reflectionmethod,PHP ReflectionMethod getClosure()用法及代碼示例

ReflectionMethod::getClosure()函數是PHP中的一個內置函數&#xff0c;用于為該方法返回動態創建的閉包&#xff0c;否則&#xff0c;在出現錯誤的情況下返回NULL。用法:Closure ReflectionMethod::getClosure ( $object )參數&#xff1a;該函數接受參數對象&#xff0c;該參…

java學習筆記--IO流

第十二章大綱&#xff1a; I/O input/output 輸入/輸出 一、創建文件&#xff0c;借助File類來實現 file.createNewFile() &#xff1a; 創建文件 file.exists() &#xff1a; 判斷文件是否存在&#xff0c;如果存在&#xff0c;則返回true delete() &#xff1a; 刪除文件&…

linux命令之kill篇

作業四&#xff1a;查詢firewall進程&#xff0c;然后殺死 [rootlocalhost 桌面]# ps -aux |grep firewall root 772 0.0 2.0 327912 20704 ? Ssl 15:23 0:00 /usr/bin/python -Es /usr/sbin/firewalld --nofork --nopid root 5323 0.0 0.0 112660…

ActiveMQ網絡連接器

這篇文章對我和任何對網絡連接器如何為ActiveMQ工作感興趣的ActiveMQ貢獻者而言都是更多的內容。 我最近花了一些時間查看代碼&#xff0c;并認為最好畫一些快速的圖表來幫助我記住我學到的東西&#xff0c;并在將來發現問題時幫助將來確定在哪里進行調試。 如果我輸入有誤&…

《程序設計與數據結構》第3周學習總結

學號 20162317 《程序設計與數據結構》第3周學習總結 教材學習內容總結 第三章的內容相比之前兩章更為具體&#xff0c;介紹的內容更為集中&#xff0c;主要說到了類和對象的問題&#xff0c;其中也仔細介紹了String類、Random類、Math類、NumberFormat類等類。此外也說到了與類…

Java中帶有JWebSocket的WebServerSocket

首先&#xff0c;轉到http://jwebsocket.org/下載2個軟件包Server and Client。 如果要查看源代碼&#xff0c;請下載源代碼包。 服務器 解壓縮服務器程序包。 轉到“ conf”文件夾 選擇“ jWebSocket.xml”文件打開 編輯“ jWebSocket.xml”文件&#xff0c;在標簽<dom…

OpenCV入門指南----人臉檢測

本篇介紹圖像處理與模式識別中最熱門的一個領域——人臉檢測&#xff08;人臉識別&#xff09;。人臉檢測可以說是學術界的寵兒&#xff0c;在不少EI&#xff0c;SCI高級別論文都能看到它的身影。甚至很多高校學生的畢業設計都會涉及到人臉檢測。當然人臉檢測的巨大實用價值也讓…

matlab提取艾里斑,艾里斑:我不是雀斑

正是艾里斑&#xff0c;限制了光學儀器的精度我們知道凸透鏡能把入射光會聚到它的焦點上&#xff0c;由于透鏡的口徑有一定大小&#xff0c;限制了光線的傳播&#xff0c;所以凸透鏡也會發生衍射。這導致透鏡無法把光線會聚成無限小的點&#xff0c;而只會在焦點上形成具有一定…

mysql啟動錯誤排查-無法申請足夠內存

一般情況下mysql的啟動錯誤還是很容易排查的&#xff0c;但是今天我們就來說一下不一般的情況。拿到一臺服務器&#xff0c;安裝完mysql后進行啟動&#xff0c;啟動錯誤如下&#xff1a; 有同學會說&#xff0c;哥們兒你是不是buffer pool設置太大了&#xff0c;設置了96G內存。…

Spring vs Guice:重要的一個關鍵區別

根據彈簧對象的名稱識別它們 不管使用XML還是Java配置都沒有關系&#xff0c;Spring范圍大致類似于Map <String&#xff0c;Object>結構。 這意味著您不能有兩個名稱相同的對象 。 為什么這是一件壞事&#xff1f; 如果您的大型應用程序包含許多Configuration類或XML文件…

php 批量更新死鎖,php – 在嘗試獲取鎖定時,哪個查詢導致死鎖;嘗試重新啟動事務...

我無法弄清楚哪個Query在嘗試獲取鎖定時導致死鎖;嘗試重新啟動事務.我的mysql包裝器有以下幾行if (mysql_errno($this->conn) 1213) {$this->bug_log(0,"Deadlock. SQL:".$this->sql);}bug_log寫入文件的位置.錯誤日志文件沒有死鎖錯誤,但/var/log/mysqld.…

Task和BackTask

一、總結性知識點&#xff1a; 1、Android應用運行時會創建任務Task&#xff0c;用于存放主窗口2、每一個任務包含一個堆棧數據結構&#xff0c;用于保存當前應用已創建的窗口對象&#xff0c;這個堆棧即回退棧BackStack3&#xff64; 位于回退棧頂的窗口會處于焦點狀態4&#…

Java面試題二

1、public、private、protected、Friendly的區別與作用域 public,protected,friendly,private的訪問權限如下&#xff1a; 關鍵字 當前類 包內 子孫類 包外 public √ √ √ √ protected…

使用Spring Roo進行快速云開發–第1部分:Google App Engine(GAE)

Spring Roo是在Java平臺上提供快速應用程序開發的工具。 我已經解釋了何時使用它&#xff1a; http : //www.kai-waehner.de/blog/2011/04/05/when-to-use-spring-roo 。 Spring Roo目前支持兩種針對云計算的解決方案&#xff1a;Google App Engine&#xff08;GAE&#xff09;…

mysql 重裝,Windows系統中完全卸載MySQL數據庫實現重裝mysql

一、在控制面板&#xff0c;卸載MySQL的所有組件控制面板——》所有控制面板項——》程序和功能&#xff0c;卸載所有和MySQL有關的程序二、找到你的MysQL安裝路徑&#xff0c;看還有沒有和MySQL有關的文件夾&#xff0c;全刪如果安裝在C盤&#xff0c;檢查一下C:\Program File…

loadrunner 關聯

1、記住關聯的位置&#xff08;之前&#xff09;&#xff0c;因為登錄之前需要token&#xff0c;才能驗證登錄是否成功&#xff0c;所以&#xff0c;放在登錄之前 轉載于:https://www.cnblogs.com/zyp1/p/5692343.html