Java Shiro:强制第二领域身份验证,即使现有会话已经通过其他领域进行身份验证
在使用ApacheShiro进行AuthC和AuthZ的web应用程序中,我有两个身份验证领域:一个用于常规web界面(称为Java Shiro:强制第二领域身份验证,即使现有会话已经通过其他领域进行身份验证,java,guice,shiro,Java,Guice,Shiro,在使用ApacheShiro进行AuthC和AuthZ的web应用程序中,我有两个身份验证领域:一个用于常规web界面(称为SsoRealm),另一个用于REST API(称为RestRealm),使用API令牌。由这两个领域验证的主体具有不相交的权限(和AuthenticationTokens)。如果没有预先存在的会话,并且API调用通过REST接口到达,则一切正常,通过RestRealm进行身份验证(和授权)。但是,如果存在先前通过验证的现有会话 ssoream没有通过restream进行身
SsoRealm
),另一个用于REST API(称为RestRealm
),使用API令牌。由这两个领域验证的主体具有不相交的权限(和AuthenticationTokens
)。如果没有预先存在的会话,并且API调用通过REST接口到达,则一切正常,通过RestRealm
进行身份验证(和授权)。但是,如果存在先前通过验证的现有会话
ssoream
没有通过restream
进行身份验证尝试,并且连续授权检查(使用Subject.isPermitted
)失败,因为主题来自错误的领域
相应的身份验证筛选器注册为(使用Shiro Guice):
我能做些什么来强制使用“正确”域进行重新身份验证
自定义
AuthenticationStrategy
是否有帮助(即AuthenticationStrategy
合同是否允许实施策略“如果涉及restream
,则restream
验证需要成功”)?AFAICSModularRealAuthenticator.doMultiRealmAuthentication
如果存在已验证的会话,则不会再次调用…事实证明,这是一个相当容易解决的问题:只需覆盖AuthenticationFilter#isAccessAllowed
即可确保为您的域验证“正确”主体类型(默认实现只使用Subject#isAuthenticated
来测试任何主体是否经过身份验证——不管它是否符合领域)
addFilterChain("/api/x/*/y", REST_AUTH, NO_SESSION_CREATION);
addFilterChain("/**", SSO_AUTH);