Shiro和客户证书

时间:2017-06-26 17:12:30

标签: jsf-2 shiro tomee-7 picketlink

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

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

令人惊讶的是,我在找到一些关于如何在Shiro中执行此操作的信息时遇到了一些麻烦,它并不直接看起来。对我来说有点意外,没有任何东西可以开箱即用#34;在Shiro中实现客户端证书身份验证。

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

另外,我不清楚如何在未提供证书时分配访客用户,因为显然TomEE是验证客户端的人,因此如果没有提供证书,我的代码将不会被执行分配访客用户。我可以在TomEE中打开两个不同的端口,但随后访问将不统一,因为我希望像系统中的任何其他用户一样对待访客用户。怎么办呢?

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

1 个答案:

答案 0 :(得分:1)

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

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

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

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

Tomcat的问题可以通过使用<Connector port="..." ClientAuth="want" ...来解决,let space = " " var negativeSpaceTwo = 22 var xTwo = 3 for circumTwo in 1...11{ xTwo += 2 negativeSpaceTwo -= 2 print(String(repeating: "-", count: negativeSpaceTwo) , String(repeating:"*", count: xTwo )) } print(space) print(space) var negativeSpaceThree = 11 var xThree = 3 for circumTwo in 1...11{ xThree += 2 negativeSpaceThree -= 1 print(String(repeating: "-", count: negativeSpaceThree) , String(repeating:"*", count: xThree )) } 会要求提供证书,但如果没有提供证书则不会停止用户。