来自不同 url 时的不同登录

Posted

技术标签:

【中文标题】来自不同 url 时的不同登录【英文标题】:Different logins when coming from different urls 【发布时间】:2011-08-04 15:52:00 【问题描述】:

我有一个使用自定义 authenticationManager 登录的应用程序。它只是在名为“用户”的表上搜索。

<sec:authentication-manager alias="authenticationManager">
    <sec:authentication-provider user-service-ref="userDAOImpl">
        <sec:password-encoder hash="sha" />
    </sec:authentication-provider>
</sec:authentication-manager>

问题是现在我需要再次登录,必须在“ExternalUsers”表上搜索。

应用程序将以这种方式工作:

    如果请求来自像 /external/** 这样的 url,我需要通过一个 authenticationManager2 来搜索表“ExternalUsers”。这些用户只能访问 /external/** url 如果请求来自另一个 url,我需要通过在表 Users 上搜索的 authenticationManager1(我现在拥有的)。这些用户可以访问所有 url,但匹配模式 /external/** 的那些

Users 和 ExternalUsers 表中可能有用户具有相同的用户名。这就是为什么我需要根据它来自的 url 设置不同的登录名的原因。两个登录名必须在同一个应用程序中。

是否可以在Spring中根据请求的url分别配置两个不同的authenticationManager?

谢谢

【问题讨论】:

【参考方案1】:

我不认为,弹簧开箱即用。但是您可以实现自己的身份验证提供程序(实现AuthenticationProvider 接口),根据某些逻辑将身份验证委托给一个两个标准的弹簧身份验证提供程序。

【讨论】:

但是authenticationManager的实现怎么知道请求的url呢? @Javi:我的错:身份验证提供者不是管理器【参考方案2】:

Spring Security 的未来版本可能允许多个身份验证管理器,但在此之前,一些自定义将完成这项工作。

我认为拉尔夫的回答是正确的。您可以添加另一个 http 元素 (Spring Security 3.1) 来捕获 external/** url 模式,并添加您的自定义登录过滤器以将不同的令牌(可以命名为扩展 AbstractAuthenticationToken 的 ExternalUserPasswordAuthenticationToken)传递给身份验证提供程序。请参阅Configuring Spring Security 3.x to have multiple entry points 和我对Authenticate user using external webservice in grails 的回答,以开发您自己的令牌和提供程序。

另一种我不推荐的方法是为 /external/** url 模式设置一个 Voter 来执行身份验证工作。

【讨论】:

以上是关于来自不同 url 时的不同登录的主要内容,如果未能解决你的问题,请参考以下文章

如何通过 asyncTask 方法解析来自 2 个不同 URL 的数据

Spring Security(Java Config)登录 - 根据用户角色返回不同的 URL

来自 URL 的文件大小与存储中的下载文件不同

如何在 iOS WKWebView 中过滤来自不同 URL 的确认对话框

Django:如果在 urls.py 中登录,则重定向到不同的页面

用户角色的不同目标 URL