2011-07-18 42 views
17

我正在使用glassfish和jaas模塊。Glassfish 3.1默認主體角色映射

我以這種方式配置了我的web.xml。

<security-constraint> 
    <web-resource-collection> 
     <web-resource-name>ALL Page for admin</web-resource-name> 
     <url-pattern>/*</url-pattern> 
    </web-resource-collection> 
    <auth-constraint> 
     <role-name>user</role-name> 
    </auth-constraint> 
</security-constraint> 
<login-config> 
    <auth-method>BASIC</auth-method> 
    <realm-name>file</realm-name> 
</login-config> 
<security-role> 
    <description>Administrator</description> 
    <role-name>user</role-name> 
</security-role> 

這意味着所有想要訪問我的Web應用程序的用戶都需要該用戶。

然後在GlassFish控制檯上我需要打勾的選項: 配置 - >服務器配置 - >安全 - >默認校長角色映射

我的問題是,爲什麼我需要勾選此默認委託方角色映射?而我怎麼能改變我的web.xml以避免打勾?

非常感謝

盧瓦克

回答

37

當你指定web.xml的角色和角色您正在使用的聲明性安全,基本上依賴於使用JAAS的強制聲明性的認證和授權要求。

部署描述符中指定的角色僅僅是應用程序中使用的角色的表示。這些角色不需要與運行時使用的用戶身份數據庫(或認證領域)中存在的角色相同,通常情況下這些角色可能不同,因爲應用程序的開發可能已經在不考慮實際用戶的情況下進行並且存在於用戶身份數據庫中的組。

通常,使用容器特定的部署描述符,在web.xml中指定的聲明角色與用戶身份數據庫中存在的主體或組之間執行映射。在Glassfish 3,1中,這恰好是glassfish-web.xml文件。每個這樣的映射都會以glassfish-web.xml(對於WAR文件部署)或glassfish-application.xml(對於EAR文件部署)或glassfish-ejb-jar.xml(對於用於EAR文件部署)的以下方式將應用程序中的聲明角色映射到JAAS領域中的主體或組EJB JAR文件部署):

與GlassFish的web.xml

<?xml version="1.0" encoding="UTF-8"?> 
<!DOCTYPE glassfish-web-app PUBLIC "-//GlassFish.org//DTD GlassFish Application Server 3.1 Servlet 3.0//EN" "http://glassfish.org/dtds/glassfish-web-app_3_0-1.dtd"> 
<glassfish-web-app error-url=""> 
... 
    <security-role-mapping> 
     <role-name>user</role-name> 
     <principal-name>Root</principal-name> <!-- Map a principal to the role 'user' --> 
     <group-name>Administrators</group-name> <!-- Map a group to the role 'user' --> 
    </security-role-mapping> 
... 
</glassfish-web-app> 

與GlassFish的application.xml

<?xml version="1.0" encoding="UTF-8"?> 
<!DOCTYPE glassfish-application PUBLIC "-//GlassFish.org//DTD GlassFish Application Server 3.1 Java EE Application 6.0//EN" "http://glassfish.org/dtds/glassfish-application_6_0-1.dtd"> 
<glassfish-application> 
... 
    <security-role-mapping> 
     <role-name>user</role-name> 
     <principal-name>Root</principal-name> <!-- Map a principal to the role 'user' --> 
     <group-name>Administrators</group-name> <!-- Map a group to the role 'user' --> 
    </security-role-mapping> 
... 
</glassfish-application> 

的glassfish-ejb-jar.xml中

<?xml version="1.0" encoding="UTF-8"?> 
<!DOCTYPE glassfish-ejb-jar PUBLIC "-//GlassFish.org//DTD GlassFish Application Server 3.1 EJB 3.1//EN" "http://glassfish.org/dtds/glassfish-ejb-jar_3_1-1.dtd"> 
<glassfish-ejb-jar> 
... 
    <security-role-mapping> 
     <role-name>user</role-name> 
     <principal-name>Root</principal-name> <!-- Map a principal to the role 'user' --> 
     <group-name>Administrators</group-name> <!-- Map a group to the role 'user' --> 
    </security-role-mapping> 
... 
</glassfish-ejb-jar> 

上面描述符映射作用user與名稱Root的個人身份,並與在領域名稱Administrators一個用戶組的負責人。您可以省略其中任何一種映射,並且只保留角色到主體映射或角色到組映射。您也可能有多個主體映射到同一個角色,或多個組映射到同一個角色,甚至有多個主體和組映射到同一個角色。

理解JAAS領域中的主體和組的概念非常重要 - 主體代表系統中主體(登錄到應用程序的用戶)的身份,它可以是個人身份(單個用戶)或組標識(用戶組)。通過將聲明角色映射到實際主體或組,可以針對任何用戶身份數據庫(即任何領域)強制執行web.xml中指定的規則,並且能夠動態執行,而無需對代碼庫進行任何更改;畢竟,這種改變需要將聲明角色重新映射到一組新的校長和團隊,這可能是不同的領域。您可以在the chapter on security in the Java EE 6 tutorial中找到關於Java EE安全性和JAAS如何協同工作的基本教程。

Glassfish允許一個簡化的映射方案,它不需要爲容器特定的部署描述符(在本例中爲glassfish-web.xml)中的所有聲明性角色執行映射,只要聲明性角色恰好與委託人或組織的名稱相似。這是角色映射方案的默認主體。看來在你的情況下,你所在領域的委託人/團體與在web.xml中指定的聲明角色是一樣的,因此你可以避免明確地將角色映射到委託人和團體。簡而言之,如果角色user與您的JAAS領域中的主體user或用戶組user相同(對於其他身份也類似),則可以使用Glassfish的默認角色到主體映射方案,而無需每次都映射此方案角色在您的web.xml文件中。

如果您希望避免將默認主體的部署選項標記爲角色映射,那麼您必須像在其他應用程序服務器上通常那樣將角色提供給特定於容器的部署描述符中的主體/組映射。

您可以在one of the posts on blogs.oracle.com that describes this feature of Glassfish中閱讀關於此主題的更多信息。

+0

感謝您的回答。其實我想要做的是有一個組叫做用戶。每個用戶都是這個組的一部分。這意味着每個從我的應用程序中擁有帳戶的人(這是一場戰爭)都可以使用密碼和用戶進行連接。然後我自己管理誰可以訪問應用程序中的內容。 – user789148

+0

如果我使用您爲glassfish-web.xml提供的代碼。試圖證明我的應用程序時出現以下錯誤。禁止訪問指定資源(拒絕訪問請求的資源)。它甚至不給我登錄屏幕 – user789148

+0

對不起。好吧,我現在明白了。我只需要添加來自我的用戶的映射,它的工作原理:)謝謝你很多搖滾 – user789148