当前位置: 首页 > 知识库问答 >
问题:

Spring Security OAuth2使用外部登录页面登录

滕成双
2023-03-14
  • 客户端SPA应用程序,我要使用的登录页面驻留于此
  • OAuth身份验证服务器(使用Spring Security OAuth/@EnableAuthorizationServer)
  • 一个或多个OAuth资源服务器

我寻求的OAuth流如下所示:

  • 用户尝试访问SPA中的安全路由
  • 客户端将用户重定向到OAuth服务器的授权页(参数包括状态、随机数等)
  • OAuth服务器未检测到令牌并重定向到SPA的登录页
  • 用户登录;post到登录url(登录url位于OAuth服务器上;CORS配置需要允许从SPA到OAuth服务器的跨源post)
  • 登录成功;Spring重定向到最初请求的授权页面,该页面具有最初存在的参数
  • 授权重定向到令牌;用户获得令牌;SPA检测到用户现在具有令牌并允许访问安全路由
@Override
protected void configure(HttpSecurity http) throws Exception {
    http.cors()
        .and()
        ... config ...
        .and()
        .formLogin()
        .loginPage("http://angular-spa-app/login") 
        .loginProcessingUrl("/login")
        .permitAll();
}

当我执行此流程时,我看到对OAUTH/AUTHORIZE?state=...&nonce=...&等等..发出的第一个请求,然后重定向到http://angulat-spa-app/login。但当我登录时,Spring无法检测到它是否应该重定向回保存在会话中的OAuth/authorizeurl。

进一步深入研究,我发现当发出对OAuth/authorize的第一个请求时,会将包含参数的完整url保存在会话(httpsessionRequestCache.saveRequest(...)中。

当登录表单提交并且身份验证成功时,Spring尝试检索保存的请求,以便获得重定向url作为302位置头发送。但当它这样做时,会话为空,因此Spring无法检索任何已保存的请求。这是为什么?我需要修改Spring会话设置来解决这个问题吗?

共有1个答案

何建中
2023-03-14

问题根本不在于Spring Security;是和角形水疗。当从Angular应用程序将跨域发布返回/login时,我需要发送JSESSION_ID cookie。

为此,我创建了HTTPInterceptor(如下所述):

@Injectable()
export class AuthInterceptor implements HttpInterceptor {
  constructor() {}

  intercept(request: HttpRequest<any>, next: HttpHandler): Observable<HttpEvent<any>> {
    request = request.clone({
      withCredentials: true
    });
    return next.handle(request);
  }
}

withCredentials:true位是重要部分;这指示浏览器将cookie与XHR请求一起发送。

 类似资料:
  • 我想用selenium登录这个网页。我尝试了selenium的find_element_by_,并使用浏览器中的检查元素。但是我无法登录。我在搜索id、名称、类名,这样我就可以用send_keys传递数据,但是没有做到这些。有人能帮助我提供一些代码来将数据推送到所需的字段吗?谢谢。这就是我到目前为止所做的。 在此之后,我试图点击按钮登录使用 但它失败了。它给出了无法找到“登录”的错误。由于默认情况

  • 我已经设计了我自己的登录和注册页面,我想使用。如何使用它们而不是default。是否有任何API我可以调用或可能是我的后端会这样做?我还读到有用于keycloak的spring适配器,我可以使用它们吗?任何链接到任何例子都是好的。 我的第二个问题是,在注册时,我可以在中添加更多的用户详细信息,如地址、dob、性别吗?因为我的注册页面需要这些信息。

  • 而且,再一次,即使键入正确的凭据,正如我在“userDetailsService”方法中指定的那样,我也无法登录,但这次我终于可以在控制台上看到错误消息: 显然我走了,但没有离开这个地方,因为现在我不知道我的代码有什么问题...

  • 记录器文件中的日志- org.springframework.Security.Access.event.loggerlistener-安全授权失败,原因是:org.springframework.Security.Access.accessdeniedexception:访问被拒绝;通过身份验证的主体:org.springframework.security.authentication.ano

  • 我正在使用selenium在我的C#应用程序中自动登录。然而,我尝试登录的页面具有某种验证码或机器人检测技术,即使这些凭据是正确的,也会导致“不正确的凭据”。手动登录使用相同的凭据。 我尝试过的事情: 为chromeOptions设置用户代理和用户数据目录。 添加了排除参数的启用自动化禁用的信息栏的Chrome是由自动化软件控制 在无头模式下尝试了Chrome、FireFox和IE。 在登录代码中

  • 问题内容: 我开发了一个使用Spring Security的默认登录页面的应用程序。但是我想实现自己的登录页面。我将放置一个login.html而不是一个jsp页面。我想使用JQuery。我检查了许多示例,但未能实现。我是Spring和Spring Security的新手,我使用Spring Security3。我应该遵循哪些步骤? 问题答案: Spring Security中的自定义登录页面有四