安全性对于企业环境非常重要。在 Java EE 5 / GlassFish 环境中,您可以通过以下几种方式实现安全性:
传输层安全性 (TLS) / 安全套接字层 (SSL) 技术
身份验证 (Authentication) 和授权 (Authorization)
消息层安全性(仅适用于 GlassFish 中的 Web 服务)
本文讨论身份验证和授权。参考资料 [1]、[2] 和 [3] 讨论了如何在客户端和服务器端为 Enterprise JavaBeans 和 Web 服务建立 SSL 环境。Web 服务的消息层安全性将在以后的文章中讨论。
身份验证服务一般通过要求用户输入用户名和密码来实现校验用户身份的目的。在 Java EE 环境中,身份验证是和域(realm)相关联的。域可以通过多种方式存储用户身份信息,包括文件、LDAP 目录、甚至是通过 JDBC 访问的数据库(请参阅 参考资料 [4])。它还可以与 Solaris 可拔插验证模块 (Pluggable Authentication Modules, PAM) 框架一起工作。
授权服务根据所运行的软件和运行该软件的用户的身份来执行访问控制授权操作。每次当用户登录时,应用程序都会为他/她赋予一组权限。
在 Java EE 5 之前,如果您希望在某个应用程序使用授权,则需要在应用程序部署描述符 ejb-jar.xml 或 web.xml 中指定授权信息。Java EE 5 的重要改进之一就是简化了 Java EE 应用程序的开发。从 Java EE 5 开始,开发人员可以在 Java 源文件中指定注释,而无需在部署描述符中加入元数据。注释简化了 Java EE 应用程序的开发,缩短了开发周期,并降低了总体拥有成本。
JSR 250(请参阅 参考资料 [5])定义了 Java 平台中的常用注释。本文将讨论 JSR 250 中定义的安全注释,并演示如何在应用程序中通过它们来实现身份验证和授权,以获得安全性。
基本定义和示例
注释 (Annotation) 是一种特殊的修饰符,可以与其他修饰符共同使用。注释由 @ 符号、注释类型和包含在括号中的元素值对列表组成。
本节讨论 JSR 250 定义的常用安全注释。共有 5 种(请参阅 参考资料 [6]):
javax.annotation.security.PermitAll
javax.annotation.security.DenyAll
javax.annotation.security.RolesAllowed
javax.annotation.security.DeclareRoles
javax.annotation.security.RunAs
@PermitAll、@DenyAll 和 @RolesAllowed 注释是为指定 EJB 业务方法权限而定义的。@DeclareRoles 和 @RunAs 是 TYPE 级注释,用于指定与角色相关的元数据。
对于 Web 模块,您仍然需要在 web.xml 应用程序部署描述符中定义一个 <security-constraint> 来添加授权约束,这与 J2EE 1.4 相类似。在 Java EE 5 环境中,与权限相关的注释仅为 EJB 模块定义。下表总结了这些注释的基本用法。有关详细信息,请参阅 JSR 250 规范(参考资料 [5])。
注释 | 目标 | EJB 或其超类 | Servlet 或 Web 库 | 描述 | |
类型 | 方法 | ||||
@PermitAll | X | X | X | 指示某 EJB 的某个方法或所有业务方法允许被所有用户访问。 | |
@DenyAll | X | X | 指示 EJB 的某个方法不允许被任何用户访问。 | ||
@RolesAllowed | X | X | X | 指示 EJB 的某个方法或所有业务方法允许被角色列表中的用户访问。 | |
@DeclareRoles | X | X | X | 定义安全检查的角色,供 EJBContext.isCallerInRole、HttpServletRequest.isUserInRole 和 WebServiceContext.isUserInRole 使用。 | |
@RunAs | X | X(不适用于非 EJB 超类) | X(仅适用于 Servlet) | 指定某个组件的 run-as 角色。 |