4

我有一个在 Tomcat 7 上运行的 Java Web 应用程序。我在后端使用 Spring 3.2 和 Spring Security 3.1,并按照 /api/** 模式通过 RESTful URL 公开一个 API。

Web 应用程序的 UI 是使用 BackboneJS 构建的。我正在使用直接映射到 RESTful URLS 的 Backbone 模型。

UI 使用表单登录身份验证锁定,因此如果用户当前未通过身份验证,则始终将用户重定向到登录屏幕。

我现在尝试使用 http-basic 身份验证将相同的 RESTful URL 公开给另一个外部服务。不幸的是,当保护相同的 URL 模式时,Spring 似乎不允许我使用多个过滤器链。配置文件中首先定义的似乎优先。

我不想必须为相同的 RESTful 资源映射到单独的 URL 模式,但似乎我可能别无选择。

这是我的(当前已损坏的)spring 安全配置的重要示例:

<!--  configure basic http authentication -->
<http pattern="/api/**" create-session="stateless">
    <intercept-url pattern="/**" access="ROLE_USER"/>
    <http-basic/>
</http>

<!--  configure form-login authentication -->
<http auto-config="true" use-expressions="true">
    <intercept-url pattern="/ui/login" access="permitAll" />
    <intercept-url pattern="/ui/logout" access="permitAll" />
    <intercept-url pattern="/ui/loginfailed" access="permitAll" />
    <intercept-url pattern="/**" access="ROLE_USER" />
    <custom-filter ref="ajaxTimeoutRedirectFilter" after="EXCEPTION_TRANSLATION_FILTER" />
    <form-login login-page="/ui/login" default-target-url="/" authentication-failure-url="/ui/loginfailed" />
    <logout logout-success-url="/ui/logout" />
    <session-management invalid-session-url="/ui/login"/>
</http>

我的问题是: 是否可以使用 Spring Security 为相同的 URL 模式配置两种不同类型的安全性(http-basic 和 form-login)?这种情况是否有最佳实践?

谢谢你。

4

3 回答 3

1

你为什么不像这样合并两个<http>元素:

<http pattern="/api/**" use-expressions="true">
    <intercept-url pattern="/ui/login" access="permitAll" />
    <intercept-url pattern="/ui/logout" access="permitAll" />
    <intercept-url pattern="/ui/loginfailed" access="permitAll" />
    <intercept-url pattern="/**" access="ROLE_USER" />
    <http-basic/>
    <custom-filter ref="ajaxTimeoutRedirectFilter" after="EXCEPTION_TRANSLATION_FILTER" />
    <form-login login-page="/ui/login" default-target-url="/" authentication-failure-url="/ui/loginfailed" />
    <logout logout-success-url="/ui/logout" />
    <session-management invalid-session-url="/ui/login"/>
</http>

这将在同一过滤器链中设置 aUsernamePasswordAuthenticationFilter和 a BasicAuthenticationFilter,该过滤器链可以为 ui 客户端和外部服务提供服务。

于 2013-02-26T21:18:48.823 回答
1

不可能开箱即用地为单个 URL 模式应用 2 个不同的过滤器链。

但建议将唯一的 URL 模式用作 UI 和 API,因为您将来必须应用完全不同的过滤器链。

例如,SecurityContextRepository 保存会话信息并为每个请求检索。您不想通过基本身份验证对 UI 和 API 访问应用相同的内容

于 2013-03-08T18:52:58.040 回答
0

尝试在 API 配置中将pattern="/ " 替换为 pattern="/api/ ":

<http pattern="/api/**" create-session="stateless">
    <intercept-url pattern="/api/**" access="ROLE_USER"/>
    <http-basic/>
</http>
于 2013-02-27T09:28:27.823 回答