2012-02-20 52 views
1

我们有REST API的应用程序。它基于Spring,也使用Spring安全性。 例如,我们配置了一些基于角色的限制:如何使基于Spring的应用程序使用jsessionid URL参数工作

<sec:http auto-config="true" access-decision-manager-ref="accessDecisionManager"> 
    <sec:intercept-url pattern="/auth/authenticate" access="IS_AUTHENTICATED_ANONYMOUSLY"/> 
    <sec:intercept-url pattern="/auth/logout" access="IS_AUTHENTICATED_FULLY"/> 
    <sec:intercept-url pattern="https://stackoverflow.com/users/**" access="USER"/> 
</sec:http>  

它正常工作与饼干,但现在我们需要启用的可能性,通过JSESSIONID作为URL PARAM代替饼干。我认为我们不需要在我们的代码中改变任何东西,但出现了一些问题。 我请求/登录方法并从响应复制jsessionid。从那以后,我尝试请求 /用户; JSESSIONID = *并得到了401状态码,这意味着应用程序没认出我。为了使这种方法有效,我们应该改变什么?

+0

如果您在浏览器中禁用Cookie,然后登录会发生什么? – Ralph 2012-02-20 12:08:02

+0

我得到了正确的JSON响应,例如{“result”:{“status”:“SUCCESS”,“message”:“Request Succeeded”,“timestamp”:1329740163355},“data”:{“email”:“user @ **。com“,”roles“:[”USER“]}}和标题来设置jsessionid cookies – Mikhail 2012-02-20 12:11:37

+0

让我总结一下:JSessionID在浏览器中工作,但不在您的休息客户端中? – Ralph 2012-02-20 12:12:44

回答

2

一般来说,Cookie,根据认证系统,不利于基于XML的API(如SOAP和REST)。练习是在每个API调用中进行身份验证。

检查this后在同一论坛。引用该帖子:

REST服务通常在每个请求上都得到认证, 通常不会被会话认证。现在

这种情况的原因是

  • 这些类型的XML的API基地的客户或消费者不是浏览器,但其他应用程序。
  • 浏览器了解cookies,事实上cookie是针对基于浏览器的用户而不是一般的应用程序。
  • 客户可能会或可能不会理解cookie并在大多数情况下不会明白饼干不是认证这些类型的API的标准方法。

有比非标准cookie的方式处理这个更好的方法。不确定您使用的是哪个版本的spring-security,HERE是用于保护RESTful应用程序的spring-security 3.1的一个示例。

编辑:

退房this link。这迫使tomcat(不知道你是否使用tomcat)不使用cookie来处理会话。但一旦完成,这将不会处理基于cookie的会话。我不是100%确定它会工作,但你可以尝试。

+0

我绝对同意饼干基础的认证系统对REST不好,但这不是我们的决定。现在,我们需要在URL中使用jsessionId而不是cookie来制作工作机制。 – Mikhail 2012-02-20 13:47:45

+0

这不是一件容易的事情,也不是一种开箱即用的方式。由容器生成的jsessionid附加的URL arae,它知道如何处理它们。对于REST URL,它们不会生成,因此服务器不准备处理它们。 – Santosh 2012-02-20 15:37:05

+0

所以你的要求是:它应该决定运行时,如果cookie被支持,然后使用cookie,否则使用url重写? – Santosh 2012-02-20 15:38:08

相关问题