Spring Cloud OAuth2:身份验证后再次重定向到登录页面,就像使用表单登录时未经身份验证一样

Posted

技术标签:

【中文标题】Spring Cloud OAuth2:身份验证后再次重定向到登录页面,就像使用表单登录时未经身份验证一样【英文标题】:Spring Cloud OAuth2: Redirected AGAIN to login page after authentication as if unauthenticated when form login is used 【发布时间】:2017-01-12 10:43:48 【问题描述】:

我目前正在研究 Spring Cloud OAuth,并且在安全服务器中使用 HTTP 基础进行 SSO 非常成功。

现在,我正在尝试集成表单登录(Spring 默认登录页面),禁用 http 基本。但是只要输入了正确的用户名和密码,它就会再次重定向到安全服务器的登录页面,就好像它没有经过身份验证一样。

    客户端转到 SSO 服务(未经授权) 转发到安全/oauth/授权?...(未经授权) 转发到安全/登录,客户端输入正确的凭据(经过身份验证) 转发到安全/oauth/授权?...(未经授权) 再次转发到安全/登录

这是我的安全服务配置。

spring:
    profiles: development
    application:
        name: security
security:
    user:
        password: none
    oauth2:
        client:
            client-id: client
            client-secret: 1234
            grant-type: password, authorization_code, refresh_token
            scope: read, write
            auto-approve-scopes: read, write
            authorized-grant-types: password, authorization_code, refresh_token
        resource:
            user-info-uri: http://$server.address:$server.port$server.context-path/oauth/user
            token-info-uri: http://$server.address:$server.port$server.context-path/check_token
            prefer-token-info: false
    basic:
        enabled: false
server:
    port: 8082
    context-path: /security
    address: localhost

@SpringBootApplication
@EnableAuthorizationServer
public class Application extends SpringBootServletInitializer 

    /**
     * @inheritDoc 
     */
    @Override
    protected SpringApplicationBuilder configure(SpringApplicationBuilder builder) 
        builder.sources(Application.class);
        return builder;
    

    /**
     * @param arguments the command line arguments
     */
    public static void main(String[] arguments) 
        SpringApplication.run(Application.class, arguments);
    

    @Configuration
    @EnableResourceServer
    public static class ResourceServerConfiguration extends ResourceServerConfigurerAdapter 

        @Override
        public void configure(HttpSecurity http) throws Exception 
            http.authorizeRequests().anyRequest().authenticated()
                    .and()
                    .formLogin().permitAll()
                    .and()
                    .logout().permitAll();
        

    

    @Configuration
    @EnableWebSecurity
    public static class AuthenticationServerConfiguration extends WebSecurityConfigurerAdapter 

        @Override
        public void configure(HttpSecurity http) throws Exception 
            http.authorizeRequests().anyRequest().authenticated()
                    .and()
                    .formLogin().permitAll()
                     .and()
                    .logout().permitAll();
        

    


这是我的客户端服务配置:

spring:
    profiles: development
    application:
        name: sso
security:
    user:
        password: none
    oauth2:
        client:
            client-id: client
            client-secret: 1234
            access-token-uri: http://$server.address:8082/security/oauth/token
            user-authorization-uri: http://$server.address:8082/security/oauth/authorize
        resource:
            user-info-uri: http://$server.address:8082/security/oauth/user
            token-info-uri: http://$server.address:8082/security/check_token
            prefer-token-info: false
server:
    port: 8085
    context-path: /sso
    address: localhost

@SpringBootApplication
@EnableOAuth2Sso
public class Application extends SpringBootServletInitializer 

    /**
     * @inheritDoc 
     */
    @Override
    protected SpringApplicationBuilder configure(SpringApplicationBuilder builder) 
        builder.sources(Application.class);
        return builder;
    

    /**
     * @param arguments the command line arguments
     */
    public static void main(String[] arguments) 
        SpringApplication.run(Application.class, arguments);
    


我是否遗漏了什么或配置错误?请更正。

【问题讨论】:

【参考方案1】:

我遇到了同样的问题,下面的代码对我有用:

@Configuration
@EnableResourceServer
public static class ResourceServerConfiguration extends ResourceServerConfigurerAdapter 

    @Override
    public void configure(HttpSecurity http) throws Exception 
        http    .sessionManagement().sessionCreationPolicy(SessionCreationPolicy.IF_REQUIRED)
                .and()
                .authorizeRequests().anyRequest().authenticated()
                .and()
                .formLogin().permitAll()
                .and()
                .logout().permitAll();
    


正如 Spring Security 负责人所说,从 2.0.4 版本开始,Spring 默认不再创建 Session,这会导致在重定向到审批页面期间会话丢失。所以这段代码:.sessionManagement().sessionCreationPolicy(SessionCreationPolicy.IF_REQUIRED) 将强制 Spring 为这个审批流程创建一个会话。

我关注了这个示例项目:OAuth2ServerConfig

【讨论】:

欢迎来到 ***。仅包含代码的答案往往会被标记为删除,因为它们是“低质量”的。请阅读有关回答问题的帮助部分,然后考虑在您的回答中添加一些评论。【参考方案2】:

我认为您忘记了成功登录网址。如果您在 Outlook、GitHub 等中使用 SSO,则必须在您的应用程序客户端配置中指定此 url。

【讨论】:

@Diego_Arguelles 我有自己的授权服务器。 嗯,好吧,here 我找到了一个我认为会帮助你的答案。

以上是关于Spring Cloud OAuth2:身份验证后再次重定向到登录页面,就像使用表单登录时未经身份验证一样的主要内容,如果未能解决你的问题,请参考以下文章

Spring Cloud OAuth2:添加用户权限

在 Spring Boot 中成功 Oauth2 登录后 Cookie 身份验证而不是 JWT Bearer Token

Spring Boot security/OAuth2 - 丢弃远程身份验证并在访问远程 userInfo 端点后恢复本地

Google Cloud Endpoints 的自定义身份验证(而不是 OAuth2)

如何使用 Spring Boot + Angular 处理外部 OAuth2 身份验证

Spring Cloud Gateway 基于 OAuth2.0 的身份认证