使用 oauth2 在浏览器中登录后访问 REST 服务,使用 java config 访问 Spring Security

Posted

技术标签:

【中文标题】使用 oauth2 在浏览器中登录后访问 REST 服务,使用 java config 访问 Spring Security【英文标题】:Accessing REST service after login within browser using oauth2 and spring security using java config 【发布时间】:2014-09-05 07:06:51 【问题描述】:

我已经使用 sparkl2 应用程序实现了 Oauth2。我正在使用 spring-security,如使用 java config 的 sparkl2 应用程序中所述。我可以使用 curl 成功获取身份验证令牌,并且可以使用 curl 调用 Web 服务。

我的问题是

登录到我的应用程序后,如何在同一个浏览器中访问我的 REST 服务?我不确定我在这里缺少什么?

让我更详细地阐述我的问题。浏览器在登录后保持会话的方式,我们可以访问应用程序中的任何受保护资源,最好的实现方式是什么,以便我可以从浏览器测试我的 REST api

【问题讨论】:

【参考方案1】:

spring security 保持它在会话中。会话 id 存储在浏览器 cookie 中,因此它与每个请求一起传递给您的服务。然后spring security应该接受它并检查是否允许特定会话(用户登录)访问这个特定的url。

我将从在您的 java 配置中配置安全路径开始:

http.authorizeRequests().antMatchers().hasAnyRole(...)

或其他方法代替 antMatchers。

您可能必须在某些 oauth 回调中将用户登录到 Spring Security,例如:

Authentication auth = new UsernamePasswordAuthenticationToken(user, null, authorities);
SecurityContextHolder.getContext().setAuthentication(auth);

【讨论】:

感谢您的帮助。正如我之前解释的那样,我使用了 sparkl2 代码并将内存中的 tokenStore 更改为 jdbcTokenStore 但我仍然在 http 过滤器中使用内存中的令牌存储,例如 http.inMemory()... 所以我现在在尝试获取身份验证时修复了这个问题使用 curl 的令牌我不再获得身份验证令牌我可以看到当我执行 curl 时未调用 UsernamePasswordAuthenticationFilter 但是当我尝试通过应用程序中的登录表单登录时,我已成功通过身份验证。我在这里缺少什么?看起来现在有两个问题:) 您确定使用 curl 发送 POST 吗? 是的,我确定我在 curl 中进行 POST,我在第一条评论中提到的辅助问题已解决。主要问题保持不变。

以上是关于使用 oauth2 在浏览器中登录后访问 REST 服务,使用 java config 访问 Spring Security的主要内容,如果未能解决你的问题,请参考以下文章