快速业务通道

安全注释和授权在GlassFish和Java EE 5 SDK中的应用 - 编程入门网

作者 佚名技术 来源 NET编程 浏览 发布时间 2012-06-16

安全注释和授权在GlassFish和Java EE 5 SDK中的应用(2)

时间:2011-07-22

注意:

对于 @PermitAll、@DenyAll 和 @RolesAllowed 注释,类级别的注释适用于类,方法级的注释适用于方法。方法级注释覆盖类级注释行为。

示例:请参考以下代码:

@Stateless    @RolesAllowed("javaee")    public class HelloEJB implements Hello {      @PermitAll      public String hello(String msg) {        return "Hello, " + msg;      }      public String bye(String msg) {        return "Bye, " + msg;      }    }

在该示例中,hello() 方法允许被所有用户访问,bye() 方法允许被 javaee 角色中的用户访问。

@DeclareRoles 注释定义了某个组件将要使用的角色列表。在 Java EE 5 环境中,您可以通过 @javax.annotation.Resource 来查找资源,以及通过调用以下 API 来确认用户是否属于某个角色:

组件 检查角色的 API
EJB javax.ejb.EJBContext.isCallerInRole(role)
Servlet javax.servlet.http.HttpServletRequest.isUserInRole(role)
Web 服务 javax.xml.ws.WebServiceContext.isUserInRole(role)

尽管 @PermitAll、@DenyAll 和 @RolesAllowed 注释允许实现大部分的授权决策,但仍需要 @DeclareRoles 注释来帮助实现更为复杂的逻辑。

例如,假设 hello 方法允许被属于角色 A 但同时不属于角色 B 的用户访问,则以下代码片段可以实现此目的:

@Stateless    @DeclaresRoles({"A", "B"})    public class HelloEJB implements Hello {      @Resource private SessionContext sc;      public String hello(String msg) {        if (sc.isCallerInRole("A") && !sc.isCallerInRole("B")) {          ...        } else {          ...        }      }    }

在 Web 模块中,您可以在 Servlet、过滤器和标记库中指定 @DeclareRoles。JSP 页面不支持注释。

嵌入式 Web 服务调用中的 run-as 或调用者的身份标识和客户身份标识之间的关系是没有定义的。无定义则意味着您不能假定 Web 服务调用中的 run-as 和调用者身份标识作为客户标识传递。

安全注释和授权在GlassFish和Java EE 5 SDK中的应用(3)

时间:2011-07-22

注释的无效用法示例

同一方法中不能同时使用 @DenyAll、@PermitAll 和 @RolesAllowed。例如,以下这些用法是无效的:

@PermitAll    @DenyAll    public String hello()

有关详细信息,请参阅 JSR 250 规范的 2.11 节。

同一方法中不能使用 @RolesAllowed 注释两次以上。

例如,以下用法无效并且会导致编译失败:

@RolesAllowed("javaee")    @RolesAllowed("j2ee")    public String hello()

可以在 @RolesAllowed 注释中提供授权角色列表以实现想要的效果,如下所示:

@RolesAllowed({"javaee", "j2ee"})    public String hello()

安全注释的继承

本节讨论安全注释的继承。因为 GlassFish 方法的默认行为是 @PermitAll,因此为便于阅读,以下讨论将省略该注释。

继承的一般规则如下:

对于方法,使用与继承层次结构中选择的方法有关联的注释。

对于 @RunAs 注释,只考虑层次结构叶节点中的注释。

对于 @DeclareRoles 注释,继承附加在继承层次结构中。

凌众科技专业提供服务器租用、服务器托管、企业邮局、虚拟主机等服务,公司网站:http://www.lingzhong.cn 为了给广大客户了解更多的技术信息,本技术文章收集来源于网络,凌众科技尊重文章作者的版权,如果有涉及你的版权有必要删除你的文章,请和我们联系。以上信息与文章正文是不可分割的一部分,如果您要转载本文章,请保留以上信息,谢谢!

分享到: 更多

Copyright ©1999-2011 厦门凌众科技有限公司 厦门优通互联科技开发有限公司 All rights reserved

地址(ADD):厦门软件园二期望海路63号701E(东南融通旁) 邮编(ZIP):361008

电话:0592-5908028 传真:0592-5908039 咨询信箱:web@lingzhong.cn 咨询OICQ:173723134

《中华人民共和国增值电信业务经营许可证》闽B2-20100024  ICP备案:闽ICP备05037997号