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