我们有带有 REST API 的应用程序。它基于Spring,也使用Spring security。 例如,我们配置了一些基于角色的限制:
<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="/users/**" access="USER"/>
</sec:http>
它与 cookie 配合得很好,但现在我们需要启用将 jsessionid 作为 URL 参数而不是 cookie 传递的可能性。我以为我们不需要更改代码中的任何内容,但是出了问题。 我请求/login 方法并从响应中复制 jsessionid 。之后我尝试请求 /users;jsessionid=* 并得到 401 状态代码,这意味着应用程序无法识别我。为了使这种方法发挥作用,我们应该改变什么?
最佳答案
通常,基于 cookie 的身份验证系统不适合基于 XML 的 API(例如 SOAP 和 REST)。做法是对每个 API 调用进行身份验证。
检查this在同一个论坛上发帖。引用帖子:
A REST service is generally authenticated on each and every request, not normally by a session.
现在的原因是
- 这些类型的 xml 基础 API 的客户端或使用者不是浏览器,而是其他应用程序。
- 浏览器理解cookie,事实上cookie是针对基于浏览器的用户,而不是一般的应用程序。
- 客户可能会也可能不会理解 cookie,并且在大多数情况下不会理解,因为 Cookie 不是此类 API 身份验证的标准方法。
有比以非标准 cookie 方式处理这个问题更好的方法。不确定您使用的是哪个版本的 spring-security,HERE是用于保护 RESTful 应用程序的 spring-security 3.1 的示例。
编辑:
查看this link 。这会强制tomcat(不确定你是否使用tomcat)不使用cookie来处理 session 。但一旦完成,这将不会处理基于 cookie 的 session 。我不是 100% 确定它会起作用,但你可以尝试一下。
关于java - 如何使基于 Spring 的应用程序与 jsessionid URL 参数一起工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9360768/