1

我正在尝试决定如何保护现代 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 对彼此的上下文可用时存在问题。

4

1 回答 1

1

那么,您应该阅读:Java ee 教程的安全章节。

简而言之,无论是在 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 (编程安全)中所做的那样
于 2012-12-10T16:19:33.080 回答