【问题标题】:session management with spring ws backed webapplication使用 spring ws 后端 Web 应用程序进行会话管理
【发布时间】:2015-11-04 03:28:14
【问题描述】:

我正在尝试创建一个 web 应用程序,它将使用 js 前端并在后端调用 Spring WS。假设这是一个购物网站类型的网站。所以,我可以拥有OrderServiceInventoryServiceShippingService 等服务。唯一需要会话的是用户的购物车。现在,对于这个购物车,使用 servlet 容器进行会话管理有意义吗?或者,我应该使用CartService 将会话信息保存到数据库吗?

在使用 WebServices 进行会话管理时,最佳实践是什么?我想,最好的做法确实是保持服务无状态,但是如果我有无状态的 web 服务,我该如何授权用户呢?

使用 servlet 容器只是为了进行会话管理,然后让不同的控制器充当 Web 服务的代理,这完全不是一种好习惯吗?

我附上一张图片,让您更好地理解上下文。

【问题讨论】:

  • 好吧,我猜你可以在 HTTP 请求头中使用一种客户端访问密钥;我的意思是:从浏览器(登录尝试后)客户端访问代码在自定义 http 标头中传递;在 servlet 容器的服务器端,您可以获得此客户端访问令牌并检查它是否是有效令牌;然后您可以使用它来调用 Web 服务
  • 那么单个 servlet/filter 是否应该充当所有 Web 服务的授权者?
  • 是的,I0d 绝对使用单个 servlet 或过滤器
  • 如果我要使用 servlet/过滤器,那么它就可以访问会话,不是吗?如果它可以访问会话并且可以检查用户是否有资格访问 Web 服务,那么我的 WS 不需要任何类型的安全性?这是(使用 servlet 作为安全门)保护 Web 服务免受 ajax 请求影响的最佳实践吗?
  • 不……你不会;您必须访问请求并获取包含客户端访问密钥的 http 标头。像 request.getHeader("CUST-KEY");然后检查此密钥是否有效或更少(根据一些明确定义的规则)。这意味着浏览器必须在每次调用中传递这个 http 标头

标签: java spring web-services web-applications architecture


【解决方案1】:

如果我有无状态 Web 服务,如何授权用户?

  1. 如果您的应用使用外部 ws,则描述了相当常见的方法 here

  2. 如果所有的ws都是你交付的一部分,你肯定可以使用spring-security

  3. 一种非常常见的方法是使用 (apache) http 服务器作为代理,使用 ldap 之类的东西进行身份验证和授权。

使用 servlet 容器来进行会话管理,然后让不同的控制器充当 Web 服务的代理,这完全是一种好习惯吗?

我认为不是。正如here 所讨论的那样,您只能从保持 Web 服务无状态中受益,如果您需要在请求之间维护状态,请使用 cookie。

如果状态(购物车)应该在注销后仍然存在,那么像 CartService 这样的东西对我来说听起来是个好主意。

【讨论】:

  • 关于您的第 3 点 - 您的意思是我应该使用基本身份验证吗?如果是 http 服务器,我将如何存储会话特定信息?
  • 我们目前使用基本身份验证(因此它有效),但我不会将其称为最佳实践。无论如何,apache 可以进行表单身份验证和管理会话:检查this
  • 好的,我想它需要用户名存档才能进行身份验证。
  • 也许我读错了,但在 Web 服务无状态时让 servlet 容器处理会话是一个好习惯。
  • 可能有误会。 - 无状态 ws 确实是一个好习惯 - 拥有一个带有控制器的附加 servlet 容器作为真实 Web 服务的代理,这对我来说不是一个好习惯。
【解决方案2】:

如果 webservice 是无状态的,我怎么知道一个 ajax 请求被授权了?我怎么知道 ajax 请求来自 webapp1 的 user1,谁被授权?而不是来自 webapp2 的 user2,谁无权访问该服务?

好问题。快速回答是:

  1. 对于 基本身份验证:用户名:密码是 base64 编码并存储在客户端发送的每个请求的 Authorization http 标头中。见this wiki entry。标题如下所示:

    Authorization: Basic QWxhZGRpbjpvcGVuIHNlc2FtZQ==

    使用spring security,可以这样配置:

    <http pattern="/api/**" create-session="stateless">
        <intercept-url pattern='/**' access="hasRole('REMOTE')" />
        <http-basic />
    </http>
  1. 对于基于 form 的 WS 身份验证,请查看 this article

    • 首先您向 /j_spring_security_check 发送了一个发布请求。该请求将返回 Cookie,随后任何针对 Web 服务的请求都将使用该 Cookie。他们在这里将其存储在一个文本文件中:

      curl -i -X POST -d j_username=user -d j_password=userPass -c /tmp/cookies.txt @987654324@

    • 然后您可以使用文件中的 cookie 进行进一步的身份验证请求:

      curl -i --header "Accept:application/json" -X GET -b /tmp/cookies.txt @987654325@

    xml spring 安全配置可以是这样的:

    <http pattern="/api/**" create-session="stateless">
        <intercept-url pattern='/**' access="hasRole('REMOTE')" />
        <form-login />
    </http>

【讨论】:

    【解决方案3】:

    您可以参考Spring-WS security

    查看here,获取在 Spring Boot 应用程序中使用 WS-Security 的示例。具体见 WebServiceServerConfig。

    【讨论】:

    • 好的,这个链接很有帮助。但是从这里的代码 - github.com/gregturn/learning-spring-ws/blob/security/… 我无法判断为什么需要在配置中提及 dispatcherServlet。这是否意味着调度程序 servlet 将管理所有查询请求,并且我们需要在回调中指定此 Web 服务的路径?
    • 对不起,我不是 SpringWS 的专家,如果你想给我你的邮件,我会给你发一个我自己开发的非常好的项目示例,用于工作测试,带有 Spring-Boot 和 Swing 接口
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-04-26
    • 2017-01-23
    • 1970-01-01
    • 2011-06-10
    • 2020-07-25
    • 1970-01-01
    相关资源
    最近更新 更多