我目前正在开发一个基于Java EE 7、PostgreSQL和应用服务器GlassFish 4的web应用程序。我需要实现一个基于表单的身份验证,并确保某些URL的安全,因为我知道:
- 用户和角色/组(无论它们被称为什么)都存储在数据库中
- 我希望我的应用程序尽可能地"标准化"(即,我目前正在使用JSF和JPA,而没有其他框架像spring、struts…)
经过一些研究,我发现JavaEE提供了一种称为JASPIC的标准身份验证机制。因此,我将研究重点放在了JASPIC上,并阅读了多篇Stackoverflow问答和Arjan Tijms撰写的文章(顺便说一句,如果没有他的回答或评论,几乎不可能找到与Java EE相关的Stackoverload问答,这要归功于他):
- 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有一个限制需要解决(如果您想要标准的东西)。您只能在JavaEE7neneneba API之外没有依赖项。这意味着访问需要驱动程序的JDBC资源不是标准中明确规定的功能。
在我的OpenIDConnect实现中,我使用谷歌作为我的安全存储,它还向我提供了谷歌登录表单。这是使用JASPIC的一个更大的例子。
对于您自己,您可以将EJB公开到全局名称空间,并使用InitialContext来获取EJB。会有一些代码重复,因为您必须在两个地方复制EJB远程接口代码,并确保两者的serialVersionID相同。EJB可以用于连接到JPA资源以获取授权数据。
使用EJB,因为您可能会想到的另外两个选项是REST和SOAP,它们会在您的web端口上暴露一些内容,并且需要一些额外的配置来防止未经授权的访问,或者要求将它们放置在不同的系统上。
我创建的一个简单的JASPIC实现是HTTPHeaderJASPIC模块,用于与SiteMinder等更复杂的系统集成。
我不知道JASPIC,但我可以建议你看看shiro框架吗
它可以让你用最少的配置根据你的帖子做几乎所有你需要的事情。
对于基于表单的身份验证和授权,您需要JAAS。浏览以下网址-linK