如何保护Java EE 6中的混合内容资源?

时间:2012-12-10 12:44:14

标签: security java-ee-6

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

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

因此,只要我将网站划分为安全和不安全的区域,那就行得很好,我也没有问题。但是,如何根据用户对声明性安全性的身份验证级别来处理我想拥有不同行为的资源的情况。

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

在现代Java EE 6应用程序中如何实现这一目标?声明性安全性似乎不足以让它发生,因为它非常“全有或全无”。我已经阅读了一些有关程序化安全性的内容,但是所有指南都讨论了servlet,在现代Web应用程序中,我认为JSF将成为可行的方法,而不是原始的servlet。我想确保当我使用这种依赖于用户身份验证状态的混合内容保护Web应用程序时,我不会在整个Web应用程序中发送安全代码,因为这非常容易出错,而且非常混乱。 / p>

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

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

1 个答案:

答案 0 :(得分:1)

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

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

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