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

Java Shiro:强制第二领域身份验证,即使现有会话已经通过其他领域进行身份验证,java,guice,shiro,Java,Guice,Shiro,在使用ApacheShiro进行AuthC和AuthZ的web应用程序中,我有两个身份验证领域:一个用于常规web界面(称为SsoRealm),另一个用于REST API(称为RestRealm),使用API令牌。由这两个领域验证的主体具有不相交的权限(和AuthenticationTokens)。如果没有预先存在的会话,并且API调用通过REST接口到达,则一切正常,通过RestRealm进行身份验证(和授权)。但是,如果存在先前通过验证的现有会话 ssoream没有通过restream进行身

在使用ApacheShiro进行AuthC和AuthZ的web应用程序中,我有两个身份验证领域:一个用于常规web界面(称为
SsoRealm
),另一个用于REST API(称为
RestRealm
),使用API令牌。由这两个领域验证的主体具有不相交的权限(和
AuthenticationTokens
)。如果没有预先存在的会话,并且API调用通过REST接口到达,则一切正常,通过
RestRealm
进行身份验证(和授权)。但是,如果存在先前通过验证的现有会话
ssoream
没有通过
restream
进行身份验证尝试,并且连续授权检查(使用
Subject.isPermitted
)失败,因为主题来自错误的领域

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

我能做些什么来强制使用“正确”域进行重新身份验证


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

事实证明,这是一个相当容易解决的问题:只需覆盖
AuthenticationFilter#isAccessAllowed
即可确保为您的域验证“正确”主体类型(默认实现只使用
Subject#isAuthenticated
来测试任何主体是否经过身份验证——不管它是否符合领域)

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