繁体   English   中英

使用Spring Security 3.1通过表单登录和HTTP基本安全性来保护相同的RESTful资源

[英]Using Spring Security 3.1 to secure the same RESTful resources with both form-login and http-basic security

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

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

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

我现在正尝试使用HTTP基本身份验证将相同的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)? 是否有针对此类情况的最佳实践?

谢谢。

您为什么不像这样合并两个<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客户端和外部服务提供服务。

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

但是建议您使用独特的URL模式(如UI和API),因为将来您必须应用完全不同的过滤器链。

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

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM