0

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

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

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

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

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

4

1 回答 1

1

事实证明,这个问题很容易解决:只需覆盖AuthenticatingFilter#isAccessAllowed以确保“正确”主体类型已针对您的领域进行身份验证(默认实现仅用于Subject#isAuthenticated测试任何主体是否经过身份验证 - 无论它是否符合领域与否)。

于 2012-06-14T07:55:42.850 回答