【问题标题】:How do I secure mixed content resources in Java EE 6?如何保护 Java EE 6 中的混合内容资源?
【发布时间】:2012-12-10 12:44:14
【问题描述】:

我正在尝试决定如何保护现代 Web 应用程序。我对 Java EE 6 技术堆栈相对较新,但我做过一些没有利用安全性的宠物项目,所以我正在寻找一些关于使用开箱即用的 Java EE 6 安全性的一般指导。

我了解声明式安全允许您根据分配给尝试访问该资源的用户的角色来保护资源。因此,例如,用户请求特定 URL 的页面,Java EE 服务器检查用户的凭据以查看他们是否有权访问该页面。这对于只有经过身份验证的用户才能访问的资源非常有意义。很好的例子包括管理页面、用户帐户设置页面、受限内容区域。

只要我将网站划分为安全和不安全区域,就可以正常工作,我没有任何问题。但是,我如何处理我想要根据用户的身份验证级别以不同方式表现的资源以实现声明式安全的情况。

例如,如果用户是未经身份验证的用户,我可能在网站上的主页上显示一个带有登录提示的视图,但如果经过身份验证的用户访问同一资源,则应该显示某种带有帐户管理的控制面板链接等,而不是登录提示。

这是如何在现代 Java EE 6 应用程序中实现的?声明式安全似乎没有足够的表现力来允许这种情况发生,因为它非常“全有或全无”。我已经阅读了一些关于编程安全的内容,但是所有指南都在谈论 servlet,在现代 Web 应用程序中,我认为 JSF 将是要走的路,而不是原始 servlet。我想确保当我使用这种取决于用户身份验证状态的混合内容保护 Web 应用程序时,我最终不会在整个 Web 应用程序中发送垃圾邮件安全代码,因为这非常容易出错,而且非常混乱。

鉴于上述要求,您会推荐哪些解决方案?我不是在寻找一步一步的,只是一些有用的指示让我朝着正确的方向开始。 “这就是你可以使用的东西”和“这就是它如何实现你的目标”都会有所帮助!

最后一件事,我想避免将 Spring 套件加载到这个 web 应用程序上。我喜欢尽可能多地使用 Java EE 6 容器技术,而且我听说在使 Spring 托管 bean 和 Java EE 容器托管 bean 可用于彼此的上下文时存在问题。

【问题讨论】:

    标签: security java-ee-6


    【解决方案1】:

    好吧,你应该阅读:Java ee 教程的Security 章节。

    简而言之,无论是在 servlet 还是 EJB 中,您都应该:

    • 声明涉及的安全角色:@DeclareRoles("javaee6user")
    • 在您的 servlet 中
      • 对整个 servlet 使用 @ServletSecurity(@HttpConstraint(rolesAllowed = {"javaee6user"})) (声明性安全)
      • 在 servlet 的方法中检查 request.isUserInRole("javaee6user"),就像您在“旧”servlet 中所做的那样(程序安全性)
    • 在您的 EJB 中
      • @RolesAllowed("javaee6user")声明整个方法允许的角色(声明性安全)
      • 使用 @Resource SessionContext ctx; 注入 bean 上下文,并在您的方法中调用 ctx.isCallerInRole("javaee6user"),就像您在“旧”EJB 中所做的那样(程序安全性)

    【讨论】:

    • 因此,JSF 服务小程序充当前端控制器,用于对映射到 web.xml(例如 *.xhtml)中的 JSF servlet 的 JSF 资源的所有 Web 请求。显然我还没有实现 JSF servlet,所以如果我希望 JSF 根据用户的身份验证(在同一页面上显示元素 A 而不是元素 B)做出不同的反应,我将在哪里使用您提到的这些安全性。
    猜你喜欢
    • 1970-01-01
    • 2012-02-15
    • 2011-03-25
    • 2017-07-27
    • 1970-01-01
    • 2017-05-26
    • 1970-01-01
    • 2015-08-10
    • 2012-04-11
    相关资源
    最近更新 更多