使用 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 登录页面
带有 spring-security 的 OAuth2 - 通过 HTTP 方法限制 REST 访问