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

Springboot JWT OAuth2 AngularJS无状态会话

赫连越
2023-03-14

我正在尝试各种基于JavaSpring的安全实现,如下所示

1.JWT认证

  • 用户访问
  • Springboot标识为受保护的资源,并将用户重定向到 /login
  • 用户输入凭据和浏览器做一个POST /authenticate
  • 服务器验证凭据并生成JWT令牌。设置为响应标头并重定向到/
  • 浏览器加载 /.AngularJS在响应标头中识别JWT令牌,并将其存储在本地存储中
  • 所有后续调用都将在头中包含承载令牌(通过http pInterceptor注入)

注意:无状态会话

2.OAuth2身份验证

  • 用户访问权限/
  • Springboot将用户标识为受保护的资源,并将用户重定向到/login
  • /Spring security拦截了登录名。重定向到具有生成状态的Oauth2授权服务器,并将URL重定向回应用程序
  • 用户输入凭据
  • Oauth服务器重定向回应用程序URL“/login?code=xxx
@RequestMapping(value= {"/user")
public ResponseEntity<Map<String, String>> user(Principal principal) throws Exception {
    OAuth2Authentication obj = (OAuth2Authentication) principal;
    authentication = obj.getUserAuthentication();
    OAuth2AuthenticationDetails oAuth2AuthenticationDetails = (OAuth2AuthenticationDetails) obj.getDetails();
    String jwt = oAuth2AuthenticationDetails.getTokenValue();
  • 所有后续调用都将在请求中包含Cookie

注意:在服务器端创建一个有状态会话来存储会话详细信息。这是解密cookie和识别用户所必需的

现在,我想使用Oauth2JWT实现安全性,但同时无状态,如下所示

3.OAuth2 JWT无状态

  • 用户访问
  • Springboot标识为受保护的资源,并将用户重定向到 /login
  • /登录被Spring Security系统接收。使用生成的状态重定向到OAuth2授权服务器,并将URL重定向回应用程序
  • 用户输入凭据
  • Oauth服务器重定向回应用程序URL"/登录?代码=xxx
  • /Spring security拦截了登录名。识别代码和状态,通过调用OAuth2AuthenticationDetails提取JWT令牌。getTokenValue()并在响应头中设置。重定向到/
  • 浏览器加载 /.AngularJS在响应标头中识别JWT令牌,并将其存储在本地存储中
  • 所有后续调用都将在头中包含承载令牌(通过http pInterceptor注入)

问题

我试图找出如何实现上面突出显示的步骤

共有2个答案

庞阳波
2023-03-14

这可能会帮助您实现所需的解决方案。

作者建议,一旦用户成功地使用OAuth2提供商(Google等)进行身份验证,您将一个短命令牌作为URL参数发送到前端应用程序,并使用这个短命令牌将其交换为长命令牌。

都沈浪
2023-03-14

只是一个想法/方向,如果我让你正确:你可以创建一个GenericFilterBean并将其添加到HttpSecurity过滤器链。

当使用JWT时,应该有类似的东西(一个过滤器,它从报头中提取承载令牌),然后为Spring Security填充一个身份验证对象。

因此,新过滤器可以从请求中获取令牌并相应地设置响应。你也可以在不受保护的情况下处理(!)回调endpoint,如登录/回调 ,然后为您设置cookie。

在我们的应用程序中,服务器(Spring引导)是完全无状态的,没有任何oauth或有状态的东西。显然,除了AngularJS的/之外,它从未重定向任何内容或具有任何其他视图/终结点(以及/api/...下的一些REST-API)。因此,OAuth-flow完全由AngularJS处理,AngularJS反过来检查来自oauth-server的回调,并在本地设置JWT-Token(如第一种方法)。在最初的版本中,我们还试图将重定向与无状态JWT和有状态会话等混淆起来。,但是这导致了登录时非常奇怪的行为——状态(登录与否)并不总是清晰的,在某些情况下重定向是错误的等等。

 类似资料:
  • 需要一些帮助!!我对Drools中的有状态和无状态会话没有清晰的理解。我正在努力理解这一点,所以尝试了一个例子。 我在drools6.5版本上使用有状态和无状态会话测试了下面的drl,在这两种情况下都得到了相同的输出。根据我对无状态会话的理解,它应该只执行第一条规则,当应用程序对象在第一条规则中被修改时,第二条规则不应该被激活(“有效期”)。附加源代码。感谢您在这方面的帮助。

  • 我是EJB的新手,最近开始研究EJB(3.0)。我已经使用Java6年了,但以前从未使用过EJB。至少可以说,整个EJB业务的复杂性让我不知所措。我不明白我可以在哪里实际应用一些概念。 在理解无状态会话bean后,我想到的一个问题是,你能不能不要总是用一个没有本地成员的类的共享实例来替换无状态会话bean(实际上使其无状态)?我了解到正在为无状态会话bean进行实例池。如果没有状态,就不能简单地使

  • Drools中无状态会话和有状态会话的区别是什么。我浏览了不同的文件,发现下面 无状态会话执行规则时事实的任何更改都不会被规则引擎察觉,因此如果任何规则被修改,则不会发生其他规则的重新激活。 我试图执行下面的规则,发现了相同的结果

  • 我对口水还不熟悉。我试图理解Drools提供的无状态会话和有状态会话之间的区别。 根据我的初步理解, 在无状态会话的情况下,如果在任何规则的操作执行过程中修改了事实,则不会将其重新提交给推理引擎以找出与修改后的事实匹配的新规则。 在状态会话的情况下,如果在任何规则的操作执行过程中修改了事实,则它将被重新提交给推理引擎以找出与修改后的事实相匹配的新规则,然后执行相应的操作。 因此,当我试图通过编写一

  • 问题内容: 有状态会话Bean定义如下: 有状态会话Bean对象的状态由其实例变量的值组成。在有状态会话Bean中,实例变量代表唯一的客户端Bean会话的状态。因为客户端与其bean进行交互(“交谈”),所以这种状态通常称为对话状态。 无状态会话Bean定义如下: 无状态会话Bean无状态会话Bean不会与客户端保持对话状态。当客户端调用无状态Bean的方法时,该Bean的实例变量可能包含特定于该

  • 问题内容: 我希望更改为在我的Web应用程序中实现无状态Spring Security的目的是结束,但事实并非如此。 进行了此更改后,由于(根据我的假设)Spring安全性在会话中不存储任何内容,并且无法对安全的Web请求进行身份验证,因此Spring安全性似乎无法正常工作。 我如何利用此无状态功能? 我似乎尚未找到任何有关如何为无状态Web应用程序实现无状态Spring安全的示例。 谢谢 ! 问