使用Spring Security 3.1通过表单登录和http-basic安全性保护相同的RESTful资源

时间:2013-02-26 20:42:15

标签: java spring spring-security http-basic-authentication form-authentication

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

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

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

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

我不愿意为相同的RESTful资源映射到单独的URL模式,但似乎我可能没有选择。

以下是我(当前已损坏)弹簧安全配置的重要示例:                               

<!--  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)?这种情况是否有最佳做法?

谢谢。

3 个答案:

答案 0 :(得分: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>

这会在同一个过滤器链中设置UsernamePasswordAuthenticationFilterBasicAuthenticationFilter,它可以为ui客户端和外部服务提供服务。

答案 1 :(得分:1)

不可开箱即可为单个网址格式应用2个不同的过滤器链。

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

例如,SecurityContextRepository保存会话信息,并为每个请求检索。您不希望通过基本身份验证

为UI和API访问应用相同的内容

答案 2 :(得分:0)

尝试在API配置中用pattern =“/ api / ”替换pattern =“/ ”:

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