Spring Boot和OAuth2:通过反向代理重定向url

时间:2015-08-05 13:41:10

标签: java apache spring-boot spring-security-oauth2

美好的一天。

我正在开发一个在某个端口下运行的spring-boot服务,比如说服务器中的主机名:8080。用户通过apache proxy,url.com/application

访问此服务

现在配置了apache:

ProxyRequests Off
ProxyPreserveHost Off
ProxyPass /application http://hostname:8080
ProxyPassReverse /application http://hostname:8080

我使用oauth2进行身份验证,并在authserver.com中进行身份验证

Application.yml:

 oauth2:
    client:
      clientId: username
      clientSecret: 123123
      accessTokenUri: http://authserver.com/oauth/token
      userAuthorizationUri: http://authserver.com/oauth/authorize
      clientAuthenticationScheme: form
    resource:
      userInfoUri: http://authserver.com/oauth/user
      preferTokenInfo: false
  1. 我请求url.com/application
  2. 我被重定向到基于表单的身份验证authserver.com/oath/authorize?client_id=username&redirect_url=url.com/login& ...
  3. 经过身份验证后,我会重定向回url.com/login,这是在上一步中作为GET参数提供的。这是由404产生的。
  4. 如何修改Spring Boot配置中的redirect_url?它应该是url.com/application/login。

    的pom.xml:

    <dependencies>
            <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-starter-ws</artifactId>
                <version>1.3.0.M2</version>
            </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
            <exclusions>
                <exclusion>
                    <groupId>org.springframework.boot</groupId>
                    <artifactId>spring-boot-starter-tomcat</artifactId>
                </exclusion>
            </exclusions>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-undertow</artifactId>
        </dependency>
    </dependecies>
    

    安全配置:

    @EnableAutoConfiguration
    @EnableGlobalMethodSecurity(prePostEnabled = true)
    public static class WebSecurityConfig extends OAuth2SsoConfiguration {
    
        @Override
        public void configure(HttpSecurity http) throws Exception {
            http.authorizeRequests().antMatchers("/health", "/status", "/ws", "/ws/*", "/mappings", "/beans")
                    .anonymous();
            http.csrf().disable();
            super.configure(http);
        }
    
    }
    

    使用Spring Cloud Security 1.0.0.RC3

2 个答案:

答案 0 :(得分:1)

请按this回答。它解决了我的一天。

1。您必须在Apache代理上设置标头:

<VirtualHost *:443>
    ServerName www.myapp.org
    ProxyPass / http://127.0.0.1:8080/
    RequestHeader set X-Forwarded-Proto https
    RequestHeader set X-Forwarded-Port 443
    ProxyPreserveHost On
    ... (SSL directives omitted for readability)
</VirtualHost>

2。您必须告诉Spring Boot应用程序使用这些标头。所以在你的application.properties(或Spring Boots理解属性的任何其他地方)中添加以下行:

server.use-forward-headers=true

答案 1 :(得分:0)

来自OAuth2规范:

  

3.1.2。重定向端点

     

完成与资源所有者的交互后,      授权服务器将资源所有者的用户代理引导回      客户端。授权服务器将用户代理重定向到      客户端的重定向端点先前与之建立      客户端注册过程中或授权服务器      提出授权请求。

     

重定向端点URI必须是由...定义的绝对URI      [RFC3986]第4.3节。端点URI可以包括      &#34;应用程序/ X WWW的窗体-urlencoded&#34;格式化(根据附录B)查询      组件([RFC3986]第3.4节),添加时必须保留      其他查询参数。端点URI绝不能包括      片段组件。

如何处理重定向有两个选项

  • 首先,在客户注册期间,重定向网址存储在数据库
  • 其次,在请求授权期间,我们可以传递redirect_url

通过将redirect_url传递到OAuth服务器authserver.com/oath/authorize?client_id=username&redirect_url=url.com/login

,我可以看到您正在使用第二个选项

但触发此重定向的是url.com/application。因此,您需要更改/配置url.com/application以将请求重定向到authserver.com/oath/authorize?client_id=username&redirect_url=url.com/application/login

如果您在url.com/application中使用spring security,请更改登录页面配置网址。

protected void configure(HttpSecurity http) throws Exception {
    http
        .authorizeRequests()
            .antMatchers("/", "/home").permitAll()
            .anyRequest().authenticated()
            .and()
        .formLogin()
            .loginPage("authserver.com/oath/authorize?client_id=username&redirect_url=url.com/application/login")
            .permitAll()
            .and()
        .logout()
            .permitAll();
} 

由于您未显示您的应用程序代码,因此上述代码可能有效,也可能无效。