规范“JSR 318:Enterprise JavaBeansTM,Version 3.1”提到了 Bean Provider、Application Assembler、Deployer 和 System Administrator 等角色作为 EJB 创建的主要参与者。
下面是每个角色对安全前景的贡献:
- Bean Privider:使用 @RolesAllowed、@DeclareRoles 等注解来定义单个企业 bean 的逻辑安全视图。
- Application Assembler:更改/创建部署描述符定义了整个应用程序的逻辑安全视图。将安全角色引用映射到安全角色。
不应与目标企业系统环境中存在的用户组、用户、主体混淆。这些由 Deployer 处理。 - 部署者:部署者确保应用程序组装者所需的角色在目标系统中可用。将 Application Assembler 指定的安全视图映射到目标操作环境中安全域使用的机制和策略。
- 系统管理员:系统管理员配置用户并管理他们对组的成员资格。
每个角色输出的示例:
Bean 提供者:TestBean.java
@Stateless public class TestBean { @RolesAllowed({"APP-ADMIN"}) public void sayHello() { } }
ejb-jar.xml
<ejb-jar> <enterprise-beans> <session> <ejb-name>TestBean</ejb-name> <ejb-class>org.ejb.test.TestBean</ejb-class> <session-type>Stateless</session-type> </session> </enterprise-beans> </ejb-jar>
Application Assembler:列出 Deployer 必须在目标环境的安全域中映射的所有逻辑角色。
ejb-jar.xml<ejb-jar> <enterprise-beans> <session> <ejb-name>TestBean</ejb-name> <ejb-class>org.ejb.test.TestBean</ejb-class> <session-type>Stateless</session-type> <security-role-ref> <role-name>APP-ADMIN</role-name> <role-link>ADMIN</role-link> </security-role-ref> </session> </enterprise-beans> <assembly-descriptor> <security-role> <role-name>ADMIN</role-name> </security-role> <method-permission> <role-name>ADMIN</role-name> <!-- or APP-ADMIN ?--> <method> <ejb-name>TestBean</ejb-name> <method-name>sayHello</method-name> </method> </method-permission> </assembly-descriptor> </ejb-jar>
部署程序(jboss 4.2.3-GA env):为企业应用程序login-config.xml创建安全域并分配主体域<application-policy name = "MyUserSecurityDomain"> <authentication> <login-module code = "org.jboss.security.auth.spi.DatabaseServerLoginModule" flag = "required"> <module-option name = "unauthenticatedIdentity">guest</module-option> <module-option name = "dsJndiName">java:/jdbc/MyServerDS</module-option> <module-option name = "hashAlgorithm">MD5</module-option> <module-option name = "hashEncoding">HEX</module-option> <module-option name = "principalsQuery">SELECT password FROM app_user WHERE username = ? </module-option> <module-option name = "rolesQuery">SELECT role, 'Roles' FROM app_user WHERE username = ? </module-option> </login-module> </authentication>
系统管理员:确保 app_user DB 表中希望使用企业应用程序的用户具有 ADMIN 角色。
谁能举一个更完整的例子?或者随意添加任何可能丢失的内容或修改给定示例中可能出现的错误?安全流程的完整示例对许多学习 EJB 或希望参加 Oracle 认证专家 1Z0-895 的人很有用。