0

我的问题主要围绕是否有可能在 Spring 应用程序中向同一用户提供两个具有不同身份验证来源的登录表单。

我想根据选择的配置文件将不同的安全配置类(或具有静态内部配置类的同一类)添加到我的 Maven 构建中:UATProduction。或者使用部署环境来控制它(参见下面的框架)。

任何一种情况下,应用程序都应该有自己的“特权”访问(如管理页面)的身份验证提示,我希望看到应用程序的登录页面。

但是,在UAT配置文件的情况下,我希望在任何用户可以查看任何页面之前看到一个额外的登录页面,如果访问这些受保护的页面,我希望看到用于管理功能的登录页面。

这个想法是在UAT中显示应用程序,就像它在生产中运行一样,但不允许任何用户在没有首先使用单独的登录表单进行身份验证的情况下查看任何页面。

我愿意研究任何想法,但我理想的情况是允许使用不同的 Spring Security 配置集。


我尝试过/考虑过的

动态过滤器 通过注册一个动态过滤器来实现这个想法,我很幸运地实现了这个想法,该过滤器捕获了任何请求并转发到一个 servlet,其唯一目的是处理显示不同的登录页面和处理外部身份验证(全部打包在一个包含在UAT 的构建时间),但这不是 Spring 应用程序,我相信调度 servlet 会否定这种方法。

Frame (app-ception) 我考虑过在具有自己的安全性的外部“UAT Viewer”应用程序的框架内显示应用程序的想法,理论上可以分割 Spring Security 问题。但我不知道这是否会为外部和内部应用程序创建不同的 cookie(出于安全原因,我很少考虑框架)。理想情况下,我想拒绝 x-frame-options 标头中的所有框架以帮助防止点击劫持,但如果这种方法可行,我只需将框架策略更改为同源即可。

我想我会先尝试框架方法并报告回来。

考虑到这一点,将在框架中呈现的内部应用程序仍然必须可供外部世界访问,以便客户端可以加载它,因此这种方法违背了隔离内部应用程序而对其代码影响最小的目的。

4

1 回答 1

0

解决方案是添加对单独项目(在 Maven 中具有“UAT”配置文件)的依赖项,该项目提供过滤器和 Servlet,可以中断和处理 Spring 安全性正常流程之外的身份验证。

这种方法的问题在于,spring security 的过滤器会首先拦截请求,如果页面需要身份验证,则尝试重定向到指定的登录页面(或默认页面)。解决这个问题的方法是添加一个禁用弹簧安全性的路径,因此请求将绕过这些过滤器并由自定义添加的过滤器处理,如下所示:

@Override
public void configure(WebSecurity web) throws Exception {

    // Disabling security for the login-aspect addon. Will emit 404 in
    // production operation where login-aspect.jar is no added.
    web.ignoring().antMatchers("/uat-login");
}

通过这种方式,我可以拥有一个过滤器,它将对应用程序的任何请求重定向到首先映射到“/uat-login”并显示身份验证提示的外部身份验证 servlet。

另一个好处 (IMO) 是,如果触发了应用程序的注销功能并删除了会话 cookie,那么它也有效地注销了外部安全性。

这可能不是一个最佳方法,但它的工作原理 当然欢迎提出改进建议。我想我稍后会在 Github 项目中发布用于执行此操作的代码。

于 2018-02-26T00:47:17.497 回答