Shiro:即使现有会话已经通过其他领域进行了身份验证,也强制进行第二领域身份验证

时间:2012-06-07 20:55:42

标签: java guice shiro

在我使用Apache Shiro for AuthC和AuthZ的Web应用程序中,我有两个身份验证领域:一个用于常规Web界面(称为SsoRealm),另一个用于REST API(称为RestRealm)使用API​​令牌。两个域认证的主体具有析取权限(和AuthenticationTokens)。如果没有预先存在的会话,并且通过REST接口到达API调用,一切都很好,并且通过RestRealm进行身份验证(和授权)。但是,如果存在以前通过身份验证的现有会话 SsoRealm没有通过RestRealm进行身份验证尝试,并且连续授权检查(使用Subject.isPermitted)失败,因为主题来自错误的领域。

相应的身份验证过滤器注册为(使用Shiro Guice):

addFilterChain("/api/x/*/y", REST_AUTH, NO_SESSION_CREATION);
addFilterChain("/**", SSO_AUTH);

我有什么办法可以强制重新认证“正确”的领域吗?

自定义AuthenticationStrategy是否有帮助(即AuthenticationStrategy合同是否允许实施策略“如果涉及RestRealm,则RestRealm身份验证需要成功“)?如果存在经过身份验证的会话,则不会再次调用AFAICS ModularRealmAuthenticator.doMultiRealmAuthentication

1 个答案:

答案 0 :(得分:1)

事实证明,这个很容易解决:只需覆盖AuthenticatingFilter#isAccessAllowed以确保为您的领域验证'正确'主体类型(默认实现仅使用Subject#isAuthenticated测试是否有任何委托人经过身份验证 - 无论它是否适合这个领域。