當你指定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中閱讀關於此主題的更多信息。
感謝您的回答。其實我想要做的是有一個組叫做用戶。每個用戶都是這個組的一部分。這意味着每個從我的應用程序中擁有帳戶的人(這是一場戰爭)都可以使用密碼和用戶進行連接。然後我自己管理誰可以訪問應用程序中的內容。 – user789148
如果我使用您爲glassfish-web.xml提供的代碼。試圖證明我的應用程序時出現以下錯誤。禁止訪問指定資源(拒絕訪問請求的資源)。它甚至不給我登錄屏幕 – user789148
對不起。好吧,我現在明白了。我只需要添加來自我的用戶的映射,它的工作原理:)謝謝你很多搖滾 – user789148