1

对于我的 JSF/TomEE 应用程序,我有一个 NoSQL 数据库,其中包含用户和角色,这些用户和角色指定用户如何以只读或写入的方式访问资源(基本上是 url 参数中的 ID)。

我想实现安全性,这篇文章给了我一些想法,但我很想尝试第三方库——可能是 Shiro 或 PicketLink。规则是用户将使用客户端证书对自己进行身份验证,如果未提供,他们将作为默认访客用户进行身份验证。

令人惊讶的是,我在寻找有关如何在 Shiro 中执行此操作的一些信息时遇到了一些麻烦,它看起来并不直截了当。Shiro 中没有“开箱即用”的东西来实现客户端证书身份验证,这让我有点惊讶。

所以我想我必须创建一个领域来“连接” Shiro 和我的数据库。然后我读到我可能需要扩展org.apache.shiro.authc.UsernamePasswordToken以阅读证书并将其传递给 Shiro。然后我想我必须限制对 JSF xhtml 页面中内容的访问(rendered例如使用属性),我想即使在Named托管 bean 的所有方法中我也需要检查权限。

另外,我不清楚在未提供证书时如何分配来宾用户,因为显然是验证客户端的是 TomEE,所以如果没有提供证书,我的代码将不会被执行以分配来宾用户。我可以在 TomEE 中打开两个不同的端口,但是访问将不会统一,因为我想将访客用户与系统中的任何其他用户一视同仁。如何才能做到这一点?

这是否在 PicketLink 中以更简单的方式实现?(这也为 JSF 做好了更好的准备)

4

1 回答 1

1

好的,我花了一些时间和大量的研究,所以我将戏剧性地总结我的发现。我记录了所有内容,但不想创建书籍章节。

所以我决定和 Shiro 一起去,我描述的所有东西都有效并且可以完成。Shiro 的这个 X509 证书项目非常有用。基本上,您需要实现一个覆盖两种方法(一种用于身份验证,另一种用于授权)的领域——在我之前提到的代码中有一个类可以扩展。

用户不提供证书的区分可以在 Shiro 过滤器中完成,因此当没有提供令牌(证书)时,可以动态创建或从密钥库中读取。

为了限制 JSF 中的访问,有一些 shiro 标签可以提供帮助,无需使用rendered. 我还在访问数据库的 bean 或其他类中检查了权限。一旦在授权方法中建立了权限,这将起作用。

Tomcat 的问题可以通过使用<Connector port="..." ClientAuth="want" ...which 来解决,它会要求提供证书,但如果没有提供证书,则不会阻止用户。

于 2017-07-03T19:16:51.887 回答