使用 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的主要内容,如果未能解决你的问题,请参考以下文章

如何在使用 OAuth2 社交登录保护 REST API 的同时配置 Spring Boot 登录页面

使用 OAuth2 保护 REST Web 服务:一般原则

Spring Oauth2 和 Rest 后端

带有 spring-security 的 OAuth2 - 通过 HTTP 方法限制 REST 访问

Spring Security OAuth2 在 REST 服务上被拒绝访问

带有 Spring Boot REST 应用程序的 OAuth2 - 无法使用令牌访问资源