spring oauth2sso如何运作?为什么会出现重定向序列?

时间:2018-04-12 21:35:32

标签: java spring spring-security oauth-2.0 spring-security-oauth2

我想写一个hello world示例来理解SSO / oauth2

我采取了以下示例:

http://www.baeldung.com/sso-spring-security-oauth2

首先,我需要说它运作正常。我的问题是,它正在发挥作用。

我的问题与客户端应用程序有关。它是一个简单的应用程序,只包含几个类。最重要的课程是:

UiSecurityConfig:

@Configuration
@EnableOAuth2Sso
public class UiSecurityConfig extends WebSecurityConfigurerAdapter {

    @Override
    public void configure(HttpSecurity http) throws Exception {
        http.antMatcher("/**")
          .authorizeRequests()
          .antMatchers("/", "/login**")
          .permitAll()
          .anyRequest()
          .authenticated();
    }
}

UiWebConfig:

@Configuration
@EnableWebMvc
public class UiWebConfig extends WebMvcConfigurerAdapter {

    @Bean
    public static PropertySourcesPlaceholderConfigurer propertySourcesPlaceholderConfigurer() {
        return new PropertySourcesPlaceholderConfigurer();
    }

    @Override
    public void configureDefaultServletHandling(final DefaultServletHandlerConfigurer configurer) {
        configurer.enable();
    }

    @Override
    public void addViewControllers(final ViewControllerRegistry registry) {
        super.addViewControllers(registry);
        registry.addViewController("/")
            .setViewName("forward:/index");
        registry.addViewController("/index");
        registry.addViewController("/securedPage");
    }

    @Override
    public void addResourceHandlers(final ResourceHandlerRegistry registry) {
        registry.addResourceHandler("/resources/**")
            .addResourceLocations("/resources/");
    }

}

以及以下配置:

server:
    port: 8082
    context-path: /ui
    session:
      cookie:
        name: UISESSION
security:
  basic:
    enabled: false
  oauth2:
    client:
      clientId: SampleClientId
      clientSecret: secret
      accessTokenUri: http://localhost:8081/auth/oauth/token
      userAuthorizationUri: http://localhost:8081/auth/oauth/authorize
    resource:
      userInfoUri: http://localhost:8081/auth/user/me
spring:
  thymeleaf:
    cache: false

问题:
1.当我开始申请并遵循链接http://localhost:8082/ui/时,我会看到登录页面。

此页面包含以下href

<a class="btn btn-primary" href="securedPage">Login</a>

当我点击此href发生某种魔法时,我在网络标签中看到: enter image description here 如你所见 1. http://localhost:8082/ui/securedPage重定向到http://localhost:8082/ui/login
2. http://localhost:8082/ui/login重定向到http://localhost:8081/auth/oauth/authorize?client_id=SampleClientId&redirect_uri=http://localhost:8082/ui/login&response_type=code&state=DuO4CX(!!!另一个域名!!!怎么样?)
3. http://localhost:8081/auth/oauth/authorize?client_id=SampleClientId&redirect_uri=http://localhost:8082/ui/login&response_type=code&state=DuO4CX重定向到http://localhost:8081/auth/login,我看到登录表单,我可以输入凭据

我不明白为什么这种方式有效 1。为什么http://localhost:8082/ui/securedPage重定向到http://localhost:8082/ui/login ??? 我没有这个网址的映射。当我开始应用程序时,我看到以下映射日志:​​

2018-04-12 19:50:04.069  INFO 4388 --- [           main] o.s.w.s.handler.SimpleUrlHandlerMapping  : Root mapping to handler of type [class org.springframework.web.servlet.mvc.ParameterizableViewController]
2018-04-12 19:50:04.069  INFO 4388 --- [           main] o.s.w.s.handler.SimpleUrlHandlerMapping  : Mapped URL path [/index] onto handler of type [class org.springframework.web.servlet.mvc.ParameterizableViewController]
2018-04-12 19:50:04.069  INFO 4388 --- [           main] o.s.w.s.handler.SimpleUrlHandlerMapping  : Mapped URL path [/securedPage] onto handler of type [class org.springframework.web.servlet.mvc.ParameterizableViewController]
2018-04-12 19:50:04.085  INFO 4388 --- [           main] o.s.w.s.handler.SimpleUrlHandlerMapping  : Mapped URL path [/resources/**] onto handler of type [class org.springframework.web.servlet.resource.ResourceHttpRequestHandler]
2018-04-12 19:50:04.088  INFO 4388 --- [           main] o.s.w.s.handler.SimpleUrlHandlerMapping  : Mapped URL path [/**] onto handler of type [class org.springframework.web.servlet.resource.DefaultServletHttpRequestHandler]

所有后续步骤也不清楚。请详细解释。

1 个答案:

答案 0 :(得分:2)

var users:[UserInfo] = [] { didSet { tableView.reloadData() } } 未显示在映射的URL列表中,因为它由http://localhost:8082/ui/login处理,从而启动身份验证流程。

我认为解释所有步骤的最佳方法是使用OAuth 2.0 specification

以下是流程图:

OAuth2ClientAuthenticationProcessingFilter

资源所有者 - 它是用户
用户代理 - 用户的浏览器
客户 - Web application deployed on 8082 port
授权服务器 - Web application deployed on 8081 port

  

(A)客户端通过指导资源所有者来启动流程           用户代理到授权端点。客户包括           其客户端标识符,请求的范围,本地状态和a           授权服务器将发送的重定向URI           一旦访问被授予(或被拒绝),用户代理就会返回。

在您尝试访问 +----------+ | Resource | | Owner | | | +----------+ ^ | (B) +----|-----+ Client Identifier +---------------+ | -+----(A)-- & Redirection URI ---->| | | User- | | Authorization | | Agent -+----(B)-- User authenticates --->| Server | | | | | | -+----(C)-- Authorization Code ---<| | +-|----|---+ +---------------+ | | ^ v (A) (C) | | | | | | ^ v | | +---------+ | | | |>---(D)-- Authorization Code ---------' | | Client | & Redirection URI | | | | | |<---(E)----- Access Token -------------------' +---------+ (w/ Optional Refresh Token) 的情况下,她会被重定向到securedPage,从而启动身份验证流程。
之后,用户被重定向到授权端点。在你的情况下它是http://localhost:8082/ui/login

  

(B)授权服务器对资源所有者进行身份验证(通过           用户代理)并确定资源所有者           授予或拒绝客户的访问请求。

此处将用户重定向到授权服务器登录页面(http://localhost:8081/auth/oauth/authorize)。

  

(C)假设资源所有者授予访问权限,授权           服务器使用以下命令将用户代理重定向回客户端           前面提供的重定向URI(在请求中或在期间)           客户注册)。重定向URI包括           授权代码和客户端提供的任何本地状态           早。

如果身份验证成功,则使用在授权端点的请求中的步骤(A)中提供的URL将用户重定向回客户端。在你的情况下它是http://localhost:8081/auth/login。重定向包括授权服务器生成的授权代码。

  

(D)客户端从授权请求访问令牌           服务器的令牌端点,包括授权码           在上一步收到。在提出请求时,           客户端使用授权服务器进行身份验证客户端           包括用于获取授权的重定向URI           验证码。

     

(E)授权服务器对客户端进行身份验证,验证客户端           授权代码,并确保重定向URI           收到匹配用于重定向客户端的URI           步骤(C)。如果有效,授权服务器将回复           访问令牌和(可选)刷新令牌。

客户端使用授权代码从令牌端点(&redirect_uri=http://localhost:8082/ui/login)获取访问令牌。访问令牌用于访问受保护资源。在您的情况下,它是http://localhost:8081/auth/oauth/token,用于获取有关用户的信息。此信息用于填充安全上下文。