我正在尝试创建一个web应用程序,它将使用js前端并在后端调用Spring WS。假设这是一个购物网站类型的网站。所以,我可以提供OrderService
InventoryService
ShippingService
等服务。唯一需要会话的是用户的购物车。现在,就这个购物车而言,使用servlet容器进行会话管理是否有意义?或者,我应该将CartService
持久保存到数据库的会话信息吗?
使用WebServices进行会话管理时,最佳做法是什么?我想,最好的做法是保持服务无状态,但如果我有无状态的网络服务,如何授权用户?
使用servlet容器进行会话管理,然后让不同的控制器充当web服务的代理,这是一个很好的做法吗?
答案 0 :(得分:5)
如果我有无状态网络服务,如何授权用户?
如果你的应用程序使用外部ws,则描述了相当常见的方法here。
如果所有ws都是您投放的一部分,您肯定可以使用spring-security。
一种非常常见的方法是将(apache)http服务器作为代理,例如ldap,用于身份验证和授权。
使用servlet容器进行会话管理,然后让不同的控制器充当web服务的代理,这是一个很好的做法吗?
我认为不是。正如所讨论的here,您只能从保持Web服务无状态中受益,如果您需要在请求之间维护状态,请使用cookie。
如果状态(购物车)应该在注销后继续存在,那么 CartService 之类的东西对我来说听起来不错。
答案 1 :(得分:2)
您可以参考Spring-WS security
检查here,查看在Spring Boot应用程序中使用WS-Security的示例。具体来说,请参阅WebServiceServerConfig。
答案 2 :(得分:2)
如果webservice是无状态的,我怎么知道ajax请求被授权?我怎么知道ajax请求来自webapp1的user1,谁被授权?而不是来自webapp2的user2,谁没有被授权访问该服务?
好问题。快速回答是:
对于基本身份验证:用户名:密码为base64编码,并存储在授权 http标头中,用于客户端发送的每个请求。见this wiki entry。标题如下所示:
Authorization: Basic QWxhZGRpbjpvcGVuIHNlc2FtZQ==
使用spring security,配置可以是这样的:
<http pattern="/api/**" create-session="stateless">
<intercept-url pattern='/**' access="hasRole('REMOTE')" />
<http-basic />
</http>
对于基于 form 的WS身份验证,请查看this article。
首先,您向 / j_spring_security_check 发送了一个帖子请求。此请求将返回Cookie,然后将由任何后续请求对Web服务使用。在这里,他们将它存储在一个文本文件中:
curl -i -X POST -d j_username=user -d j_password=userPass -c /tmp/cookies.txt
http://localhost:8080/app/j_spring_security_check
然后,您可以使用文件中的cookie进行进一步的经过身份验证的请求:
curl -i --header "Accept:application/json" -X GET -b /tmp/cookies.txt
http://localhost:8080/app/api/foos
xml spring安全配置如下所示:
<http pattern="/api/**" create-session="stateless">
<intercept-url pattern='/**' access="hasRole('REMOTE')" />
<form-login />
</http>