Shiro 和客户端证书

Shiro and client certs

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

我想实现安全性和 this post gave me some ideas 但我很想尝试第 3 方库 - 可能是 Shiro 或 PicketLink。规则是用户将使用客户端证书对自己进行身份验证,如果未提供,他们将被验证为默认来宾用户。

令人惊讶的是,我在查找有关如何在 Shiro 中执行此操作的一些信息时遇到了一些麻烦,它看起来并不直接。令我有点惊讶的是,Shiro中没有"out of the box"实现客户端证书认证。

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

此外,我不清楚在没有提供证书的情况下如何分配来宾用户,因为显然是 TomEE 验证客户端,所以如果没有提供证书,我的代码将不会执行以分配来宾用户。我可以在 TomEE 中打开两个不同的端口,但是访问将不会统一,因为我想像系统中的任何其他用户一样对待来宾用户。如何做到这一点?

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

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

所以我决定和 Shiro 一起去,我描述的一切都有效并且可以完成。 This X509certificate project for Shiro 非常有用。基本上,您需要实现一个 Realm 来覆盖两种方法(一种用于身份验证,另一种用于授权)——在我之前提到的代码中有一个 class 可以扩展。

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

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

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