对于我的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做好了准备)
答案 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 ))
}
会要求提供证书,但如果没有提供证书则不会停止用户。