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 Boot 中成功 Oauth2 登录后 Cookie 身份验证而不是 JWT Bearer Token
Spring Boot security/OAuth2 - 丢弃远程身份验证并在访问远程 userInfo 端点后恢复本地
Google Cloud Endpoints 的自定义身份验证(而不是 OAuth2)