Java开发网 Java开发网
注册 | 登录 | 帮助 | 搜索 | 排行榜 | 发帖统计  

您没有登录

» Java开发网 » Java Security  

按打印兼容模式打印这个话题 打印话题    把这个话题寄给朋友 寄给朋友    该主题的所有更新都将Email到你的邮箱 订阅主题
flat modethreaded modego to previous topicgo to next topicgo to back
作者 [转载]基于角色的安全
bawanglongqiqi





发贴: 73
积分: 37
于 2005-02-16 11:00 user profilesend a private message to usersearch all posts byselect and copy to clipboard. 
ie only, sorry for netscape users:-)add this post to my favorite list
出自:http://partner.bea.com.cn 作者:不详
此部分中的主题解释如何将对资源(Web Service、页面流、Java 控件,等等)的访问权限限制于仅被授予了特定安全角色的那些用户。

  要限制访问权限,需要设置以下两种测试,候选用户必须通过这些测试才能访问某些资源:身份验证流程(确定用户的标识和组成员资格)和授权流程(确定用户是否具备访问特定资源所需的角色成员资格)。

  身份验证流程
  首先使用身份验证流程测试候选用户。身份验证流程通常是登录流程,它将要求候选用户提供用户名和密码。如果候选用户成功通过此质询,将授予该用户一组标识:其中一个标识是其用户名标识,其他标识是一组该用户具有其成员资格的组。用户的用户名标识和组标识称为用户的“委托人”:可将这些委托人视为一组凭据,用户在访问某些由授权流程所保护的资源时需要提供这些凭据。

  授权流程
  在授权流程中,将测试用户是否已被授予了访问受保护资源所需的角色。如果这些用户已被授予所需角色,则他们可以访问资源;否则,将被拒绝访问。如果用户的一个委托人已被授予了特定角色,则该用户也被授予了该角色。委托人由一组角色-委托人映射授予角色。

  角色-委托人映射是在部署描述符配置文件中定义的。因此,应用程序代码可以不依赖于其部署环境:应用程序代码仅引用访问其资源所需的一组角色,而不引用任何特定的用户、组或委托人。而这些将在包含角色-委托人映射的部署描述符中被引用。

  作用域角色
  使用 WebLogic Workshop 定义的角色和角色-委托人映射可以具有三个不同的作用域:
  1. 应用程序作用域(在应用程序的 application.xml / weblogic-application.xml 文件中定义)
  2. Web 应用程序作用域(在项目的 web.xml / weblogic.xml 文件中定义)
  3. EJB 作用域(在 EJB 的 ejb-jar.xml / weblogic-ejb-jar.xml 文件中定义)
   (1) 应用程序作用域角色包含较窄的(2) Web 应用程序和(3) EJB 作用域。这意味着可以在授权流程中使用 (1) 应用程序作用域角色,以保护应用程序内的任何资源,而 (2) Web 应用程序作用域角色仅适用于单个 Web 项目内的资源,(3) EJB 作用域角色仅适用于单个 EJB 内的资源。请注意,EJB 作用域角色并不仅仅保护 WebLogic Workshop 的 EJB 项目:这些角色还可用于保护 Web Service、Java 控件扩展(JCX 文件)和 JPD 文件。这是因为所有这些文件在编译时都将被编译为 EJB。

  下图显示了三种作用域的角色及相应部署描述符,可以使用 WebLogic Workshop 定义这些描述符。

  另请注意,WebLogic Server 可定义一组全局作用域的角色,这些角色可应用于部署到 WebLogic Server 的任何应用程序和任何资源。但不能定义全局作用域的角色-委托人映射:所有映射都是应用程序或组件的部署描述符的一部分。

  安全批注
  WebLogic Workshop 使用 @common:security rolesAllowed 批注声明 EJB 作用域的角色和角色映射。(必须在项目的 WEB-INF/web.xml 和 WEB-INF/weblogic.xml 文件中手工维护 Web 应用程序作用域的角色和映射。)

  @common:security
  @common:security 批注可用于在任何派生于 Java 的文件(JPF 文件除外,包括 JWS、JCX、JCS 和 JPD 等文件)中放置角色限制。该批注可放在类级或单个方法上。放在类级时,该批注将允许所引用的角色访问该类中的任何方法。放在单个方法上时,该批注将限制仅角色引用可以访问该方法。

  在将 @common:security rolesAllowed 批注放在特定资源上时,WebLogic Workshop 将在 EJB 部署描述符中自动声明相应的 EJB 作用域角色。另外,它还将在 EJB 部署描述符中声明角色-委托人映射。

  @jpf:controller 和 @jpf:action
  JPF 文件使用 @jpf:controller 和 @jpf:action 批注设置授权流程。@jpf:controller 用于类级;而@jpf:action 用于方法级。将 @jpf:controller rolesAllowed 放在类级时,该批注将允许所引用的角色访问该类中的任何方法。将 @jpf:action rolesAllowed 放在单个方法上时,该批注将限制仅角色引用可以访问该方法。

  @jpf:controller 和 @jpf:action 批注不会在 Web 应用程序的部署描述符(web.xml 和 weblogic.xml)中自动声明相应的角色和角色映射。相反,这些批注假设 Web 应用程序作用域或应用程序作用域中已经存在相应的角色声明。

  WebLogic Workshop 在 Java 代码中遇到角色限制时,将首先在最窄作用域内查找所需的角色声明和角色映射。如果没有找到这些声明和映射,Workshop 将接着在较宽作用域内搜索,直至找到这些声明和映射。例如,如果使用 @jpf:action rolesAllowed 批注在页面流内设置角色限制,则可以在 Web 容器作用域或应用程序作用域中声明角色和角色映射。WebLogic Workshop 将首先在 web.xml / weblogic.xml 中查找角色声明和角色映射;如果没有找到,WebLogic Workshop 将在 application.xml / weblogic-application.xml 文件中查找。

  授权
  通过身份验证流程建立了用户的标识和委托人之后,授权流程将确定允许该用户访问哪些资源。通过基于角色的安全,可以根据用户/委托人的角色成员资格来控制授权流程。下面的主题解释了如何设置基于角色的授权流程,以控制用户对 Web Service、页面流、控件及其单个方法的访问权限。

  要将 Web 资源限制于仅被授予了特定安全角色的那些用户,必须执行以下操作:

设置身份验证流程
定义访问 Web 资源所要求的安全角色

  设置身份验证流程
  在通过授权流程测试用户之前,必须通过身份验证流程建立该用户的标识。

  以下示例显示了设置身份验证过程的一个策略。请注意,下列配置元素不包含设置身份验证过程的显式指令。其中包含的唯一显式指令用于设置授权过程,即客户端必须被授予了 Users 角色才能访问资源。但 WebLogic Workshop 通过同时设置身份验证过程和授权过程来响应这些授权过程的显式指令。要进入的客户端将被要求提供用户名/密码,以获取与可通过授权过程进行测试的客户端相关联的一组委托人。

<url-pattern>/*</url-pattern> 元素通知 WebLogic Workshop 保护项目内的所有资源。<role-name>Users</role-name> 元素(“授权约束”的缩写)表明客户端必须被授予 Users 角色才能访问 <url-pattern> 元素中定义的资源。
<security-constraint>
<display-name>
Security Constraint for all resources within this project.
</display-name>
<web-resource-collection>
<web-resource-name>All web resources within this project</web-resource-name>
<description>A web service secured by SLL and basic authentication</description>

<!--
定义受保护 Web 资源的范围。
保护此项目内的所有资源。
-->

<url-pattern>/*</url-pattern>
<http-method>GET</http-method>
<http-method>POST</http-method>
</web-resource-collection>

<!--
客户端必须被授予 Users 角色才能
访问此 Web 资源。
-->

<auth-constraint>
<role-name>Users</role-name>
</auth-constraint>
</security-constraint>

<security-role>
<role-name>Users</role-name>
</security-role>

  请注意,由 <auth-constraint> 元素设置的授权过程不是为了实际阻止任何特定客户端组访问 Web 资源。相反,要进入的客户端可以“自由”通过此授权过程,我们的目的是设置身份验证过程。我们通过将下列 <security-role-assignment> 元素放置在项目的 WEB-INF/weblogic.xml 文件中,将 Users 角色映射到“用户”委托人,从而允许客户端自由通过此特定授权过程。我们还利用了 WebLogic Server 能够自动向所有成功登录的客户端分配“用户”委托人这一事实。

<!--
向具有“用户”委托人的客户端授予 Users 角色。
所有成功登录的客户端都将自动获得“用户”委托人。
WebLogic Server 默认授予“用户”委托人。
无需向客户端明确授予“用户”委托人。
-->

<security-role-assignment>
<role-name>Users</role-name>
<principal-name>users</principal-name>
</security-role-assignment>

  有关其他身份验证策略,请参阅 WebLogic Workshop 文档中的身份验证和 WebLogic Workshop 8.1 文档中的 Developing Secure Web Applications。

  注意:基于表单的身份验证不应与 WebLogic Workshop 的安全批注一起使用,因为当用户从登录表单页面被重定向到资源时,该重定向操作将会失败。

  定义访问 Web 资源所要求的安全角色
  Web Service 和控件

  使用 @common:security roles-allowed 批注可以定义访问 Web Service 或 Web Service 内单个方法所要求的角色。

  在下面的示例中,具有 Administrators 角色的用户可以访问 Web Service HelloWorld 中的所有方法(因为类级 @common:security 批注中引用了 Administrators)。

/**
* 具有 Administrators 角色的用户可以访问此 Web Service 中的任何方法。
*
* @common:security roles-allowed="Administrators"
*/
public class HelloWorld implements com.bea.jws.WebService
{
/**
* 仅具有 Managers 角色(或 Administrators 角色)的用户才可访问此方法。
*
* @common:operation
* @common:security roles-allowed="Managers"
*/
public String helloManagers()
{
return "Hello, Managers.";
}

/**
* 仅具有 Employees 角色(或 Administrators 角色)的用户才可访问此方法。
*
* @common:operation
* @common:security roles-allowed="Employees"
*/
public String helloEmployees()
{
return "Hello, Employees.";
}
}

  @common:security 批注中引用的角色是作用域角色,而不是全局角色。这些作用域角色适用于在 WebLogic Workshop 编译 Web Service 的过程中生成的 EJB。如果将 @common:security 批注放在 Web Service 中,则会在 EJB 的 ejb-jar.xml 部署描述符文件中自动声明所引用的每一个角色,并自动向 EJB 的 weblogic-ejb-jar.xml 部署描述符文件中写入角色-委托人映射(此时委托人与角色同名)。

...在 ejb-jar.xml 文件中

<security-role>
<role-name>Administrators</role-name>
</security-role>
<security-role>
<role-name>Employees</role-name>
</security-role>
<security-role>
<role-name>Managers</role-name>
</security-role>

<method-permission>
<role-name>Administrators</role-name>
<method>
<ejb-name>StatelessContainer</ejb-name>
<method-name>helloEmployees</method-name>
</method>
<method>
<ejb-name>StatelessContainer</ejb-name>
<method-name>helloManagers</method-name>
</method>
</method-permission>

<method-permission>
<role-name>Employees</role-name>
<method>
<ejb-name>StatelessContainer</ejb-name>
<method-name>helloEmployees</method-name>
</method>
</method-permission>

<method-permission>
<role-name>Managers</role-name>
<method>
<ejb-name>StatelessContainer</ejb-name>
<method-name>helloManagers</method-name>
</method>
</method-permission>
...在 weblogic-ejb-jar.xml 文件中
<security-role-assignment>
<role-name>Administrators</role-name>
<principal-name>Administrators</principal-name>
</security-role-assignment>
<security-role-assignment>
<role-name>Employees</role-name>
<principal-name>Employees</principal-name>
</security-role-assignment>
<security-role-assignment>
<role-name>Managers</role-name>
<principal-name>Managers</principal-name>
</security-role-assignment>

  有关作用域角色和全局角色的区别的信息,请参阅 WebLogic Server 8.1 文档中的 Types of Security Roles:Global Roles and Scoped Roles。

  页面流
  使用 @jpf:controller roles-allowed 批注可以定义访问页面流或页面流内单个方法所要求的角色。

  在下面的示例中,被授予了 Administrators 角色的用户可以访问页面流 securityController.jpf 中的所有方法。但访问任何单个方法并不一定要求用户是 Administrator。例如,不是 Administrators 的 Employees 可以访问 employeeAction() 方法。

/**
* @jpf:controller roles-allowed="Administrators"
*/
public class securityController extends PageFlowController
{

/**
* @jpf:action
* @jpf:forward name="success" path="index.jsp"
*/
protected Forward begin()
{
return new Forward( "success" );
}

/**
* @jpf:action roles-allowed="Employees"
* @jpf:forward name="success" path="employeesPage.jsp"
*/
protected Forward employeeAction()
{
return new Forward("success");
}

/**
* @jpf:action roles-allowed="Managers"
* @jpf:forward name="success" path="managersPage.jsp"
*/
protected Forward managerAction()
{
return new Forward("success");
}
}

  @jpf:controller 批注和 @jpf:action 批注中引用的角色是作用域角色,而不是全局角色。这些作用域角色适用于在 WebLogic Workshop 编译页面流的过程中生成的 Web 应用程序。在使用 @jpf:controller 和 @jpf:action 批注设置角色限制时,必须将这些角色及关联映射手工声明为 (1) 项目 web.xml / weblogic.xml 文件中的 Web 应用程序作用域角色,或 (2) 应用程序 application.xml / weblogic-application.xml 文件中的应用程序作用域角色。通过向应用程序的“安全角色”文件夹中添加角色,可以轻松实现 (2)。有关使用“安全角色”文件夹的详细信息,请参阅测试基于角色的安全。

  测试基于角色的安全
  此主题描述了设置测试用户和(应用程序作用域)角色的两种方法:(1) 通过应用程序的“安全角色”文件夹及 (2) 通过 WebLogic Server 控制台。

  使用“安全角色”文件夹
  通过“安全角色”文件夹,可以方便地添加测试用户和应用程序作用域角色,以便测试安全设计。“安全角色”文件夹在“应用程序”选项卡中显示为项目文件夹,如下所示。

  

  要使用“安全角色”文件夹,请用鼠标右键单击该文件夹,然后选择“新建角色”。

  向“安全角色”文件夹中添加名为“manager”的角色有三个作用:

向 WebLogic Server 的默认安全提供程序中添加名为“manager”、密码为“password”的用户。
在应用程序的 application.xml 文件(位于 META-INF 目录中)中声明名为“manager”的应用程序作用域角色。
将“manager”用户映射到应用程序 weblogic-application.xml 文件(位于 META-INF 目录中)中的“manager”角色。
  假设已有可用的登录机制(请参阅身份验证),您现在可以作为“manager”用户进行登录,以测试授权流程的行为。

  下图显示了“安全角色”文件夹如何在 WebLogic Server 的安全框架中自动创建测试用户,以及如何向应用程序配置文件中写入应用程序作用域角色和角色-委托人映射。

  该图还显示了 @common:security rolesAllowed 批注如何自动在 ejb-jar.xml 文件中写入 (3) EJB 作用域角色。请注意,Web Service 将被编译成 EJB:此即 @common:security rolesAllowed 批注定义 EJB 作用域角色的原因。有关 @common:security 批注的详细信息,请参阅授权。

  请注意,页面流批注 @jpf:action rolesAllowed 和 @jpf:controller rolesAllowed 不会自动向部署描述符中写入任何作用域角色。相反,必须在 web.xml / weblogic.xml 或 application.xml / weblogic-applcation.xml 部署描述符文件中手工管理这些角色。

  使用 WebLogic Server 控制台
  ...创建测试用户
  要通过 WebLogic Server 控制台输入用户,请执行下列步骤。

选择“工具”-->“WebLogic Server”-->“WebLogic 控制台”。
使用用户名/密码组合“weblogic/weblogic”登录到控制台。
导航至“Security”-->“Realms”-->“myrealm”。
通过单击“Users”文件夹和“Configure a New User”链接,可以输入新的单个用户。
   ... 定义应用程序作用域角色和角色映射

选择“工具”-->“WebLogic Server”-->“WebLogic 控制台”。
使用用户名/密码组合“weblogic/weblogic”登录到控制台。
导航至“Deployments”-->“Applications”-->“[you application's name]”。
要定义应用程序作用域角色,请用鼠标右键单击“[you application's name]”,然后选择“Define Scoped Role”。然后按所提供的向导进行操作。


要定义应用程序作用域的角色映射,请用鼠标右键单击“[you application's name]”,然后选择“Define Security Policy”。然后按所提供的向导进行操作。




话题树型展开
人气 标题 作者 字数 发贴时间
7890 [转载]基于角色的安全 bawanglongqiqi 9992 2005-02-16 11:00

flat modethreaded modego to previous topicgo to next topicgo to back
  已读帖子
  新的帖子
  被删除的帖子
Jump to the top of page

   Powered by Jute Powerful Forum® Version Jute 1.5.6 Ent
Copyright © 2002-2021 Cjsdn Team. All Righits Reserved. 闽ICP备05005120号-1
客服电话 18559299278    客服信箱 714923@qq.com    客服QQ 714923