当前位置: 首页 > 知识库问答 >
问题:

Shiro:强制第二个领域验证,即使现有会话已经通过其他领域验证

公西博实
2023-03-14

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

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

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

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

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

共有1个答案

宓诚
2023-03-14

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

 类似资料:
  • 在DropWizard中,我可以设置基本身份验证,如下所示(在impl中): 领域在DropWizard中是什么意思,在中指定它有什么意义?它创造了一些东西与这个领域在引擎盖下?

  • 问题内容: 大家好,我想创建一个与jdbc领域和自定义登录表单(基于表单的身份验证登录约束方法)捆绑在一起的应用程序登录功能。 请提供链接或任何帮助,我们将不胜感激。 请帮忙。 谢谢。 问题答案: 您使用哪种容器?jBoss?Tomcat?Derby? 您还需要使用持久性存储->是,需要DBMS。它是哪一个?MySQL,Sysbase,Oracle PL / SQL,MS SQL? 此处提供了可供

  • 3.6 ABP领域层 - 领域事件 在C#中,一个类可以定义其专属的事件并且其它类可以注册该事件并监听,当事件被触发时可以获得事件通知。这对于对于桌面应用程序或独立的Windows Service来说非常有用。但是, 对于Web应用程序来说会有点问题,因为对象是根据请求(request)被创建并且它们的生命周期都很短暂。我们很难注册其它类别的事件。同样地,直接注册其它类别的事件也造成了类之间的耦合

  • 3.4 ABP领域层 - 领域服务 3.4.1 简介 领域服务(或者服务,在DDD模式中)是被用来执行领域操作或者业务规则的。Eric Evans 在他的DDD书中这样说过:一个好的Service应该有以下三个特征: 与领域概念相关的操作不是Entity或Value Object 的一个自然部分; 接口是根据领域模型的其它元素定义的; 操作是无状态的。 领域服务和Application Servi

  • 在我的shiro.ini中,我配置了两个领域,即LDAP和JDBC 但我无法设置身份验证请求超时。 ConfigurationException:com.bc.xyz.auth.EFGLDAPRealm类型的对象不存在属性“连接超时”。在org.apache.shiro.config.reflectionBuilder.istypedProperty(reflectionBuilder.java:

  • 我用Java和spring mvc框架编写了一个简单的应用程序。 我使用tomcat领域身份验证表单auth-method对用户进行身份验证,并将其重定向到自己的仪表板。 例如,login.jsp上的用户输入用户名和密码,现在在控制器中检查名称并通过和使用request.login(用户名,密码)方法,然后将重定向客户端发送到仪表板页面。 现在我创建了一个restful api,用于检测来自服务器