我目前正在基于Java EE 7,PostgreSQL和应用程序服务器GlassFish 4的Web应用程序上工作。
我需要实现基于表单的身份验证,并知道以下几点来保护一些URL:

  • 用户和角色/组(无论他们叫什么)都存储在数据库中。
  • 我希望我的应用程序尽可能地“标准”(即我目前正在使用JSF和JPA,并且没有其他框架,例如spring,struts ...)

  • 经过研究,我发现Java EE提供了一种称为JASPIC的标准身份验证机制。因此,我将研究重点放在JASPIC上,并阅读了多个Stackoverflow Q/A和Arjan Tijms撰写的那些文章(由于没有他的回答或评论,要找到与Java EE相关的Stackoverflow Q/A几乎是不可能的,这要归功于他的支持)道路) :
  • http://arjan-tijms.blogspot.fr/2012/11/implementing-container-authentication.html
  • http://arjan-tijms.blogspot.fr/2013/04/whats-new-in-java-ee-7s-authentication.html
  • http://arjan-tijms.blogspot.fr/2014/03/implementing-container-authorization-in.html

  • 我的问题是:JASPIC允许我做我需要做的事情(表单例份验证+具有角色的URL限制),值得使用它吗?
    我的意思是:使用其他机制可能更安全,更轻松。

    Arjan Tijms还说,使用JASPIC是否是“一种鸡和蛋的问题”,并且如果JASPIC可以安全使用(它不会产生超出其解决范围的问题),无论我需要多少代码写的时候,我真的很想成为“第一批小鸡之一”。

    最佳答案

    我正在使用JASPIC进行身份验证,但是JASPIC有一个限制需要克服(如果您希望将其标准化)。您仅限于在Java EE 7 API之外没有依赖项。这意味着对需要驱动程序的JDBC资源的访问不是标准中明确规定的功能。

    OpenID Connect implementation中,我将Google用作我的安全商店,该商店也向我提供了Google登录表单。不过,那是使用JASPIC的一个更大的示例。

    您自己可以将EJB公开给全局 namespace ,并使用InitialContext获取EJB。有一些重复的代码,您必须在两个位置复制EJB远程接口(interface)代码,并确保两个版本的serialVersionID相同。 EJB可用于连接到JPA资源以获取您的授权数据。

    使用EJB,因为您可能想到的其他两个选项是REST和SOAP,它们将在Web端口上公开某些内容,并且需要进行一些额外的配置以防止未经授权的访问或要求将它们放置在其他系统上。

    如果您想学习的话,我创建了一个简单的JASPIC实现,即HTTP Header JASPIC module,它旨在与SiteMinder等更复杂的系统集成。

    09-07 15:12