问题标签 [spring-oauth2]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
1 回答
6042 浏览

java - TokenEndpoint:处理空指针异常

我尝试通过 curl 执行此命令从我的 oauth2 服务器请求代码

回应是

检查我的日志后,我收到了这个错误。

我的配置要点

0 投票
2 回答
1997 浏览

java - Spring 如何将新的 _csrf 令牌添加到会话变量中?

当有人POST/oauth/authorizeSpring OAuth2 中执行操作时(此链接上 API 的源代码),CSRF 令牌会在服务器上更新。

可以使用哪些特定的代码语法:
1.) 在代码中访问新生成的 CSRF 令牌?
2.) 将新生成的 CSRF 令牌的副本分配给惰性会话变量?
3.) 随后检索新的会话变量以在不同的类中使用?

此要求的上下文是一个控制流,其中涉及通过多个过滤器和控制器的可变路由,而用户通过/oauth/authorize端点进行多次传递。变量需要保存到会话范围,然后根据算法的需要从会话范围中检索并放回请求范围。

可能需要创建和使用上述会话变量的类类型示例包括:

1.) 任何具有@Controller annotation,
2.) 任何自定义实现OncePerRequestFilter ,
3.) 任何自定义实现DefaultOAuth2RequestFactory,
4.) 以及自定义过滤器链中使用的其他类型的类。

这可能是 Spring MVC 问题或 Spring Security 问题,或两者兼而有之,即使它涉及 Spring OAuth2 API,其源代码是由 Spring MVC 和 Spring Security 构建的。

0 投票
1 回答
732 浏览

spring - 如何在spring security中配置web security以允许某些url访问?

如何在 java 中配置 WebSecurity 以允许访问某些 url。我试过如下

在上面我想允许“/rest/ ” **对所有人(这意味着这个 url 不应该处于安全状态)并且“/admin /**”应该是安全的并且具有管理员权限。仅供参考,我也将它与 Spring oauth 一起使用,所以“/oauth/token”也应该可供所有人访问。

0 投票
1 回答
583 浏览

spring - 如何编码授权 request_uri

我需要为 Spring OAuth2 的实现构建一个自定义 request_uri。 应该使用什么特定代码来正确编码 request_uri 中的每个参数?

完整的未编码request_uri如下,但会导致错误,指示未授予令牌:

如您所见,各个参数是:

用于构造上述 request_uri 的代码是:

更具体地说,这个 OP 询问应该使用什么语法来编码上面代码中的以下字符串值:newRequestUriclientIdredirectUrirespTypestate.

官方 OAuth2 规范说你可以使用Content application/x-www-form-urlencoded-Type 和UTF-8编码,但也给出了这个例子:

类似地,Spring OAuth2 开发者指南只包含一个词的用法encode

0 投票
1 回答
1615 浏览

java - 状态如何在 Spring OAuth2 中进行编码或加密?

Spring OAuth2 中与令牌state相关的参数具体如何?_csrf 是我们期望state的加密版本吗?_csrf

_csrf此外,在将新值封装到stateSpring OAuth2 中的新参数之前,应该使用什么特定的 Java 语法来编码和加密它?


**上下文:**

客户端应用程序将用户的 Web 浏览器从客户端应用程序重定向到授权服务器的 authserver/login 页面。然后,在授权服务器应用程序中,使用 的自定义实现OncePerRequestFilter将请求重定向/oauth/authorize?(list of params)到其他身份验证步骤,最终重定向回新请求到/oauth/authorize?(list of params). 问题是令牌在额外的身份验证步骤期间发生了变化_csrf并且文档表明它_csrf被用作state参数。这意味着授权服务器可能需要更新该值以反映新值state_csrf


**如何生成“状态”:**
问题在于,在客户端应用程序使用“OAuth2ClientAuthenticationProcessingFilter ”传输信息以供身份验证服务器在通过上述身份验证步骤对用户进行身份验证时使用 之前,客户端应用程序已经设置了“状态”的编码和加密值。一些研究表明,`state` 键是由客户端使用`DefaultStateKeyGenerator`生成的,而后者又使用`RandomValueStringGenrator`生成 6 个字符的状态值。

例如,在对 的原始请求中/oauth/authorize?(list of params),原始_csrf值被编码为fupS1L,如下面的 url 所示:

如果在重定向流期间_csrf值更改为,则 state 参数中的值将不再有效,并且生成的令牌将无权允许访问受保护的资源。a69fd23a-a393-4b27-a685-a323fd31db9afupS1L

为了将新_csrf值转换为类似于fupS1L可以传递给功能state参数的加密值,我使用什么特定语法?

state另外,变量和_csrf令牌之间有什么关系吗?使用的RandomValueStringGeneratorbyDefaultStateKeyGenerator似乎只是创建了一个随机的 6 个字符的字符串。我希望深入研究代码甚至编写代码的人给出权威的答案。我正在对代码进行深入审查,因此阅读RandomValueStringGenerator源代码并说状态与csrf令牌无关的偶然路人不会增加任何价值。然而,API 的作者会告诉我们它是如何工作的,从而为我们提供了很多帮助。


**注意春天:**
它不应该需要这么多的挖掘来找到这样一个简单事物的文档。
0 投票
0 回答
262 浏览

java - Spring CSRF 转发/禁用

是我的示例应用程序。GATEWAY 是所有其他应用程序的入口点。基本上它是代理。它能够进行csrf保护。当我访问 url localhost:8080/login 首先为 GATEWAY 创建 csrf 令牌,然后将请求转发到后端服务 (UAA)。
问题是 UAA 生成它自己的令牌 (_csrf) 和一个由 GATEWAY 在标头中生成的令牌,因为 X-CSRF-TOKEN 完全不同。

那么如何避免这种冲突呢?是否有任何简单的解决方案可以在应用程序之间共享令牌?

谢谢

0 投票
2 回答
2701 浏览

spring - 替换 AuthorizationRequest 后的 HttpSession null

下面给出了快速重现问题的完整代码和说明。


问题:
的自定义实现HttpSession将当前替换为已保存的. nullDefaultOAuth2RequestFactoryAuthorizationRequestAuthorizationRequest 这会导致后续请求失败,因为/oauth/token端点之前的 Spring Security 过滤器链中的CsrfFilter无法在/oauth/token中找到 a与's进行比较。 session Csrf tokennull sessionrequestCsrf token


错误期间的控制流程:

以下流程图说明了步骤 14步骤 15以某种方式nullHttpSession. (或者可能与 a 不匹配JSESSIONID。)第 14 步SYSO开头的CustomOAuth2RequestFactory.javaA表明确实存在 a实际上包含正确的。然而,不知何故,当第 15 步触发客户端在url 上返回到端点 的调用时,它已经变成了。HttpSessionCsrfTokenHttpSessionnulllocalhost:8080/loginlocalhost:9999/oauth/token

HttpSessionSecurityContextRepository在下面的调试日志中提到的每一行都添加了断点。(它位于 eclipse 项目的Maven Dependencies文件夹中authserver。)这些断点确认了在下面的流程图中发出HttpSession最终null请求的时间。/oauth/token(流程图的左下角。)null HttpSession可能是由于自定义代码运行JSESSIONID后保留在浏览器中的内容已过时。DefaultOAuth2RequestFactory

如何解决此问题,以便在流程图中的第 15 步结束后,在对端点HttpSession的最终呼叫期间保持不变?/oauth/token


相关代码和日志:

的完整代码CustomOAuth2RequestFactory.java 可以通过单击此链接在文件共享站点上查看。 我们可以猜测这null session是由于 1.)JSESSIONID中的代码没有在浏览器中更新CustomOAuth2RequestFactory,或者 2.)HttpSession实际被null-ified。

步骤 15/oauth/token之后调用的 Spring Boot 调试日志清楚地表明此时没有,可以读取如下: HttpSession


在您的计算机上重现问题:

按照以下简单步骤,您只需几分钟即可在任何计算机上重现问题:

1.)通过单击此链接从文件共享站点下载应用程序的压缩版本

2.) 通过键入以下内容解压缩应用程序:tar -zxvf oauth2.tar(4).gz

authserver3.)通过导航到oauth2/authserver然后键入来启动应用程序mvn spring-boot:run

resource4.)通过导航到oauth2/resource然后键入来启动应用程序mvn spring-boot:run

ui5.)通过导航到oauth2/ui然后键入来启动应用程序mvn spring-boot:run

6.) 打开网络浏览器并导航到http : // localhost : 8080

7.) 点击Login然后输入Frodo用户名和MyRing密码,点击提交。

8.) 输入5309Pin Code然后单击提交。 这将触发上面显示的错误。

Spring Boot 调试日志将显示 A LOT of ,其中给出了流程图中显示的每个步骤SYSO的变量值,例如XSRF-TOKENHttpSession。这SYSO有助于对调试日志进行分段,以便它们更易于解释。所有这些SYSO都是由其他类调用的一个类完成的,因此您可以操纵SYSO-generating 类来更改控制流中各处的报告。SYSO生成类的名称是TestHTTP,它的源代码可以在同一个demo包中找到。


使用调试器:

1.) 选择正在运行authserver应用程序的终端窗口并键入Ctrl-C以停止authserver应用程序。

2.) 将三个应用程序(authserver、、resource和)作为现有的 maven 项目ui导入到 eclipse 中。

3.) 在authserver应用程序的 eclipse Project Explorer 中,单击展开Maven Dependencies文件夹,然后在其中向下滚动以单击展开Spring-Security-web...jar,如下图橙色圆圈所示。然后滚动查找并展开org.springframework.security.web.context包。然后双击打开HttpSessionSecurityContextRepository下面屏幕截图中以蓝色突出显示的类。向此类中的每一行添加断点。您可能希望对SecurityContextPersistenceFilter同一包中的类执行相同的操作。 这些断点将使您能够查看 的值,该值HttpSession当前在控制流结束之前变为null,但需要具有可以映射到的有效值XSRF-TOKEN才能解析此 OP。

4.) 在应用程序的demo包中,在CustomOAuth2RequestFactory.java. 然后Debug As... Spring Boot App启动调试器。

5.) 然后重复上面的步骤 6 到 8。您可能希望在每次新尝试之前清除浏览器的缓存。您可能希望打开浏览器开发工具的“网络”选项卡。

0 投票
2 回答
5196 浏览

spring-security - SpringSecurity WithSecurityContext MockMvc OAuth2 总是未经授权

例如,我已按照以下链接尝试测试 OAuth2 @PreAuthorise(hasAnyRole('ADMIN', 'TEST') 但我无法通过任何测试,甚至无法通过身份验证。

当我尝试使用管理员(或任何角色)访问端点时,它永远不会正确验证。我是否遗漏了一些明显的东西,似乎我拥有示例中的所有内容。我还尝试了使用 OAuth 特定身份验证的 WithSecurityContext Factory 的另一种替代方案,但仍然没有运气。任何帮助,将不胜感激。

https://stackoverflow.com/a/31679649/2594130http://docs.spring.io/spring-security/site/docs/4.0.x/reference/htmlsingle/#test

我正在测试的控制器

我的测试课

我的书签服务应用程序

我的 WithSecurityContextFactory

我的 WithSecurityContext 注解

根据@RobWinch 的回复

嗨@RobWinch我已经用无状态标志尝试过你的建议,这有助于部分答案。但是,在您对这个问题的回复 [Spring OAuth and Boot Integration Test] ( https://stackoverflow.com/a/31679649/2594130 ) 中,您提到

您不再需要担心是否在无状态模式下运行

为什么我仍然需要添加无状态 false,这是一个错误还是我们使用它的方式略有不同?

我需要做的另一件事是将 OAuth2Request 和 OAuth2Authentication 添加到 WithSecurityContextFactory,如下所示

0 投票
1 回答
1810 浏览

spring - Spring oAuth2 中基于用户的权限/范围

在我当前的设置中,我有独立的 spring oAuth2 服务器、独立的资源服务器和带有反向代理的 angularJs 应用程序。

在身份验证服务器端,我注册了 2 个客户端(用于服务通信的 Web 应用程序和内部客户端)。我正确接收客户端范围和用户角色。

问题 1 我需要每个用户而不是客户端(网络应用程序、移动设备、...)的不同权限(例如范围)

我尝试提供自己的 ClientsDetailService,我将为每个用户构建 ClientDetails,但我收到的唯一内容是客户端 ID(“web-app”),我无法知道哪个用户已登录。

有没有办法注入用户上下文?

相关堆栈问题

问题 2如果我将所有可用权限放在 JWT 中并在资源服务器上执行“hasPermission(...)”逻辑,我可以以某种方式解决这个问题。基本上,客户端应用程序在 N 个范围内工作,服务器基于用户角色构建权限列表并创建 JWT。但...

  • 当我删除用户权限时会发生什么?JWT 失效了吗?
  • 这种情况下的 oAuth 工作流程是什么?(refresh_token 会获得更新的权限还是用户必须再次输入凭据?)
  • 由于这似乎是不好的做法,有没有更好的解决方案?

问题3有没有一种标准的方式可以用spring oauth2 实现更细粒度的权限逻辑?(想想 100 多种具有方法级别安全性的不同权限)

0 投票
0 回答
664 浏览

spring-security - 尝试获取 OAuth2 访问令牌时找不到 404

有人可以帮忙吗,我正在尝试在我的 Rest 应用程序上设置 OAuth2,但是我遇到了一个错误。

我使用 Postman Rest Client 进行测试。

样品请求 在此处输入图像描述

弹簧安全.xml

表设置

web.xml

谢谢。