我想建立一个基于spring、security和spring-oauth2的简单OAuth2提供程序。
我在一个实例机器上完成了所有工作:对于OAuth2授权,用户被发送到/oauth/authorize。大多数用户没有登录,因此通过spring安全性将它们重定向到/login,然后返回t /oauth/authorize以完成授权。
在默认配置中,spring安全使用会话id在用户浏览器中设置cookie,并将会话数据存储在内存中。
public static class SecurityConfiguration extends WebSecurityConfigurerAdapter {
@Override
protected void configure(HttpSecurity http) throws Exception {
http
.authorizeRequests()
.and()
.formLogin()
.loginPage("/login")
.permitAll();
}
[...]为了在不放松用户会话的情况下启用负载平衡和蓝绿色部署,我必须执行以下步骤:
/login重定向的重定向url存储在不同的位置,
这种方法有意义吗?有什么变化是必要的?
发布于 2016-11-27 17:24:44
这是一个典型的分布式会话存储问题。首先,“会话”(会话is和cookie)与“无状态”相结合的概念是一种矛盾。
OAuth2应该是一个“无状态”委托授权框架(),前提是在生成访问代码之前,将初始输入请求(包括重定向url)持久化在服务器端。
在接收凭据之前将这些详细信息泄露给cookie可能会使您受到安全漏洞的攻击。您可以通过确保cookie是HttpOnly (JS无法访问)和secure (仅通过httpS发布)来降低风险,但无论如何,我不会推荐这种方法。
关于另一点:Security的“记住-我”特性被设计为只带有对身份验证凭据的引用,而不是对初始auth2请求的详细信息。此外,默认情况下,持久化选项(PersistentTokenBasedRememberMeServices)只支持内存(单节点)和jdbc风格。
调整这些以满足你的需要将需要相当大的改变。可行,但需要付出很大的努力。
根据我的经验,我想到了两种选择:
发布于 2016-07-20 21:35:13
如果您查看协议section-4.1的这一部分,就需要C点和D点之间的共享内存。
这在服务器之外的任何内容中都无法实现,因为这是验证客户端应用程序已被授权的点。
进程后面的访问和刷新令牌也是类似的情况。
对于登录步骤(A和B点),在登录表单中有重定向url (和客户端状态-参见-4.1节)看起来很好。如果这是唯一使用会话的地方--那么您可以摆脱它。但是,授权代码仍然需要共享内存(共享数据库)。
https://stackoverflow.com/questions/38247068
复制相似问题