Spring Boot OAuth2 - 使用本地用户数据库

时间:2016-04-26 14:51:47

标签: spring-mvc spring-security spring-security-oauth2

我正在使用Spring Boot,Spring MVC和spring-security-oauth2创建网站,我正在尝试针对Google,Facebook,GitHub ... OAuth2服务对本地存储的用户进行身份验证。我也有标准的用户名密码。

我的想法是从第一次成功oauth登录后为每个用户存储一对[OAuth2_provider_type,OAuth2_subjectId]到本地数据库,然后当用户再次通过Google(或FB ...)验证自己时,使用该对找到正确的用户。我已经正确地使用Google / Facebook进行身份验证,但我不知道如何将我的本地存储用户连接到Spring OAuth2 Security并将其连接到SecurityContext。

有人可以指点一些示例或集成测试,我可以看到类似的内容吗?

在这里,我找到了很棒的教程Spring Boot and OAuth2,其中包含如何添加本地用户数据库部分的提示。试图从Google重定向到授权重定向URI http://localhost:10001/user端点,该端点定义为.antMatchers("/user").authenticated()并获取拒绝访问

o.s.s.w.a.i.FilterSecurityInterceptor - Secure object: FilterInvocation: URL: /user?state=Wj7RVk&code=4/wa2AFtJr0K3cKTxDAYo8rTOu2p41km5o3YCPnimx4wU; Attributes: [authenticated] o.s.s.w.a.i.FilterSecurityInterceptor - Previously Authenticated: org.springframework.security.authentication.AnonymousAuthenticationToken@6fa8940c: Principal: anonymousUser; Credentials: [PROTECTED]; Authenticated: true; Details: org.springframework.security.web.authentication.WebAuthenticationDetails@fffde5d4: RemoteIpAddress: 0:0:0:0:0:0:0:1; SessionId: 5888363FA9E329992073DCE4B21E8B5C; Granted Authorities: ROLE_ANONYMOUS o.s.s.access.vote.AffirmativeBased - Voter: org.springframework.security.web.access.expression.WebExpressionVoter@29802df4, returned: -1 o.s.s.w.a.ExceptionTranslationFilter - Access is denied (user is anonymous); redirecting to authentication entry point org.springframework.security.access.AccessDeniedException: Access is denied

非常感谢您的帮助!

1 个答案:

答案 0 :(得分:0)

  

尝试从Google重定向到授权重定向URI   http://localhost:10001/user

     

o.s.s.w.a.i.FilterSecurityInterceptor - 安全对象:   FilterInvocation:URL:   ?/用户状态= Wj7RVk&安培;代码= 4 / wa2AFtJr0K3cKTxDAYo8rTOu2p41km5o3YCPnimx4wU;   属性:[已验证]

看起来你是以错误的方式做到这一点,你不应该使用/usercode参数转到state!流程是:

  1. 您为网址注册了一个sso端点 localhost:8080/login/facebook
  2. 点击指向您获得的终端的链接 重定向到Facebook授权页面
  3. 获得授权后,您应该被重定向回 localhost:8080/login/facebook您的州和代码参数: localhost:8080/login/facebook?state=Wj7RVk&code=4/wa2AFtJr0K3cKTxDAYo8rTOu2p41km5o3YCPnimx4wU
  4. 当sso过滤器获取代码后再次进入facebook 将access_code交换为access_token并将令牌放入会话
  5. 在流程结束时调用AuthenticationSuccessHandler进行重定向 你根据它的具体实际(通常它是 SavedRequestAwareAuthenticationSuccessHandler
  6. 如果这些步骤成功完成,您可以转到/user端点以获取一些用户信息。