问题标签 [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 投票
2 回答
1743 浏览

spring-security - Spring Boot 资源服务器无法使用 oAuth 2 访问令牌授权角色

我有以下 3 个微服务

  • 配置服务器
  • Auth Server 使用 MongoDB 引用链接。我成功将项目从 1.2.4 迁移到 1.3.3
  • 用户服务。一个带有 3 个 Get 方法的 Rest Controller 和一个资源服务器。(每个用于 ADMIN、MERCHANT 和 CONSUMER)

我希望根据用户的角色限制对 REST 控制器的 GET 方法的访问。资源配置如下

为了测试,我只是尝试为除角色 ADMIN 之外的所有用户锁定用户服务。但是,我得到 401 Access Denied。我也尝试了 hasRole("ADMIN") 具有相同的结果。如果我删除了该授权标准,则用户已正确通过身份验证(不接受错误的访问令牌)。来自认证服务器的 userInfoUri 的响应如下

我无法弄清楚为什么基于角色的授权不起作用。任何帮助都将不胜感激。

0 投票
1 回答
19120 浏览

spring - /oauth/authorize 和 /oauth/token 在 Spring OAuth 中如何交互?

我正在深入研究 Spring OAuth,发现一些相互矛盾的信息。

具体来说,本教程指出/oauth/token端点在向客户端应用程序授予刷新令牌之前会处理用户名和密码。相比之下,Spring OAuth 开发人员指南提到了/oauth/authorize/oauth/token端点,但没有具体说明它们是如何工作的。

是否/oauth/authorize执行 100% 的username/password/nOtherFactors检查,然后向/oauth/token端点发送刷新令牌给客户端的信号,以便客户端随后将刷新令牌发送给/oauth/token端点?

还是所有这些都由/oauth/token端点处理?

不同授权类型之间/oauth/authorize的关系是否不同?/oauth/token如何?

0 投票
1 回答
2034 浏览

java - 错误 HTTP 状态 500 - 未找到 WebApplicationContext:未注册 ContextLoaderListener?

嗨,我是 Spring Security 和 Spring Oauth 的新手,我正在配置基于 Java 的 Spring Oauth 服务器和资源服务器。但是我需要配置一些基于xml的web mvc,比如需要初始化servlet参数。

下面是我的 Web.xml

和 mvc-dispatcher-servlet.xml

和错误日志如下:

安全配置.java

****OAuth2ServerConfig.java****

导入java.security.Principal;导入 java.util.UUID;

请在上面帮助我。

0 投票
2 回答
5551 浏览

spring - /oauth/token 中的 XSRF 令牌无效

多因素身份验证的 Spring OAuth2 实现的完整代码已上传到此链接的文件共享站点。下面给出了说明,只需几分钟即可在任何计算机上重新创建当前问题。


**当前问题:**
大多数身份验证算法都能正常工作。直到下面显示的控制流结束,程序才会中断。具体来说,在下面的 **SECOND PASS** 结束时会抛出“Invalid CSRF token found for http://localhost:9999/uaa/oauth/token”错误。上面链接中的应用程序是通过向这个Spring Boot OAuth2 GitHub 示例的`authserver` 应用程序添加自定义`OAuth2RequestFactory`、`TwoFactorAuthenticationFilter` 和`TwoFactorAuthenticationController` 开发的。**需要对以下代码进行哪些具体更改才能解决此 CSRF 令牌错误并启用 2 因素身份验证?** 我的研究使我怀疑 `CustomOAuth2RequestFactory`(此链接上的 API) 可能是配置解决方案的地方,因为它定义了管理`AuthorizationRequest``TokenRequest`的方法。**官方 OAuth2 规范的这一部分表明向授权端点发出的请求的 `state` 参数是添加 `csrf` 令牌的地方。** 另外,链接中的代码使用授权码授予在这个链接中描述的类型到官方规范,这意味着流程中的步骤C不会更新`csrf`代码,从而触发步骤D中的错误。(您可以查看整个流程,包括步骤C和步骤D在官方规格。)
**围绕当前错误的控制流:**
在下面的流程图中,通过 `TwoFactorAuthenticationFilter` 在 **SECOND PASS** 期间引发了当前错误。一切都按预期工作,直到控制流进入**第二次通过**。以下流程图说明了可下载应用程序中的代码所采用的两因素身份验证过程的控制流程。 具体来说,`POST`s 和 `GET`s 序列的 Firefox `HTTP` 标头表明,序列中的每个请求都会发送相同的 `XSRF` cookie。`XSRF` 令牌值在`POST /secure/two_factor_authentication` 之后才会引起问题,这会在`/oauth/authorize` 和`/oauth/token` 端点触发服务器处理,使用`/oauth/token`抛出 `Invalid CSRF token found for http://localhost:9999/uaa/oauth/token` 错误。要了解上述控制流程图与 `/oauth/authorize` 和 `/oauth/token` 端点之间的关系,您可以将上述流程图与官方规范中的单因素流程图表并排比较在单独的浏览器窗口中。上面的 **SECOND PASS** 只是第二次执行单因素官方规范中的步骤,但在 **SECOND PASS** 期间具有更大的权限。
**什么日志说:**
HTTP 请求和响应标头表明: 1.) 使用正确的 `username` 和 `password` 提交到 `9999/login` 会导致重定向到 `9999/authorize?client_id=acme&redirect_uri=/login&response_type=code&state= sGXQ4v`后跟一个`GET 9999/secure/two_factor_authenticated`。一个 XSRF 令牌在这些交易所中保持不变。( )` 并继续执行 `request 9999/oauth/token`,但 `9999/oauth/token` 拒绝该请求,因为相同的旧 XSRF 令牌与新的 `XSRF` 令牌值不匹配,该值显然是在 **第一次通过**。官方规格。但目前尚不清楚这是否会导致问题。此外,尚不清楚如何访问参数以从“TwoFactorAuthenticationController.POST”发送完整的请求。我为 `POST 9999/secure/two_factor_authentication` 控制器方法的`HttpServletRequest` 中的`parameters` `Map` 做了一个SYSO,它只包含`pinVal` 和`_csrf` 变量。您可以通过单击此链接阅读文件共享站点上的所有 HTTP 标头和 Spring Boot 日志。
**失败的方法:**
在 Spring Security 3.2 环境中尝试了@RobWinch 解决类似问题的方法,但该方法似乎不适用于 Spring OAuth2 的上下文。具体来说,当在下面显示的 `TwoFactorAuthenticationFilter` 代码中取消注释以下 `XSRF` 更新代码块时,下游请求标头确实会显示不同/新的 `XSRF` 令牌值,但会引发相同的错误。if(AuthenticationUtil.hasAuthority(ROLE_TWO_FACTOR_AUTHENTICATED)){ CsrfToken token = (CsrfToken) request.getAttribute("_csrf"); response.setHeader("XSRF-TOKEN"/*"X-CSRF-TOKEN"*/, token.getToken()); } **这表示需要更新 `XSRF` 配置,以使 `/oauth/authorize` 和 `/oauth/token` 能够相互通信并与客户端和资源应用程序进行通信,以成功管理`XSRF` 令牌值。** 也许 `CustomOAuth2RequestFactory` 需要更改才能完成此操作。但是怎么做?
**相关代码:**
`CustomOAuth2RequestFactory` 的代码是: public class CustomOAuth2RequestFactory extends DefaultOAuth2RequestFactory { public static final String SAVED_AUTHORIZATION_REQUEST_SESSION_ATTRIBUTE_NAME = "savedAuthorizationRequest"; 公共 CustomOAuth2RequestFactory(ClientDetailsS​​ervice clientDetailsS​​ervice) { super(clientDetailsS​​ervice); } @Override public AuthorizationRequest createAuthorizationRequest(Map authorizationParameters) { ServletRequestAttributes attr = (ServletRequestAttributes) RequestContextHolder.currentRequestAttributes(); HttpSession 会话 = attr.getRequest().getSession(false); if (session != null) { AuthorizationRequest 授权请求 = (AuthorizationRequest) 会话。getAttribute(SAVED_AUTHORIZATION_REQUEST_SESSION_ATTRIBUTE_NAME); if (authorizationRequest != null) { session.removeAttribute(SAVED_AUTHORIZATION_REQUEST_SESSION_ATTRIBUTE_NAME); 返回授权请求;} } return super.createAuthorizationRequest(authorizationParameters); } } `TwoFactorAuthenticationFilter` 的代码是: // 这个类是按以下方式添加的: https://stackoverflow.com/questions/30319666/two-factor-authentication-with-spring-security-oauth2 /** * 存储 oauth会话中的授权请求,以便它可以 * 稍后被 {@link com.example.CustomOAuth2RequestFactory} * 选择以继续授权流程。*/ public class TwoFactorAuthenticationFilter extends OncePerRequestFilter { private RedirectStrategy redirectStrategy = new DefaultRedirectStrategy(); 私有 OAuth2RequestFactory oAuth2RequestFactory;//下面这两个是作为测试添加的,以避免在未定义时发生的编译错误。公共静态最终字符串 ROLE_TWO_FACTOR_AUTHENTICATED = "ROLE_TWO_FACTOR_AUTHENTICATED"; 公共静态最终字符串 ROLE_TWO_FACTOR_AUTHENTICATION_ENABLED = "ROLE_TWO_FACTOR_AUTHENTICATION_ENABLED"; @Autowired public void setClientDetailsS​​ervice(ClientDetailsS​​ervice clientDetailsS​​ervice) { oAuth2RequestFactory = new DefaultOAuth2RequestFactory(clientDetailsS​​ervice); } private boolean twoFactorAuthenticationEnabled(Collection authority) { System.out.println(">>>>>>>>>>> 权限列表包括:"); for (GrantedAuthority authority : authority) { System.out.println("auth: "+authority.getAuthority() ); } 返回 authority.stream().anyMatch( authority -> ROLE_TWO_FACTOR_AUTHENTICATION_ENABLED.equals(authority.getAuthority()) ); } @Override protected void doFilterInternal(HttpServletRequest request, HttpServletResponse response, FilterChain filterChain) throws ServletException, IOException { System.out.println("-------------------- INSIDE TwoFactorAuthenticationFilter. + twoFactorAuthenticationEnabled(authorizationRequest.getAuthorities())); System.out.println("========================= twoFactorAuthenticationEnabled(SecurityContextHolder.getContext().getAuthentication().getAuthorities()) 是:" + twoFactorAuthenticationEnabled(SecurityContextHolder.getContext().getAuthentication().getAuthorities())); if (twoFactorAuthenticationEnabled(authorizationRequest.getAuthorities()) || twoFactorAuthenticationEnabled(SecurityContextHolder.getContext().getAuthentication().getAuthorities())) { // 保存 session 中的授权请求。这允许 CustomOAuth2RequestFactory // 在用户成功后将此保存的请求返回到 AuthenticationEndpoint // 进行两因素身份验证。request.getSession().setAttribute(CustomOAuth2RequestFactory.SAVED_AUTHORIZATION_REQUEST_SESSION_ATTRIBUTE_NAME, authorizationRequest); // 重定向用户需要输入两因素认证码的页面 redirectStrategy.sendRedirect(request, response, ServletUriComponentsBuilder.fromCurrentContextPath() .path(TwoFactorAuthenticationController.PATH) .toUriString()); 返回; } } //下一个“IF”块在取消注释时不能解决错误 //if(AuthenticationUtil.hasAuthority(ROLE_TWO_FACTOR_AUTHENTICATED)){ // CsrfToken token = (CsrfToken) request.getAttribute("_csrf"); // 这是作为标头或 HTTP 参数包含的令牌的值 // response.setHeader("XSRF-TOKEN", token.getToken()); //} filterChain.doFilter(request, response); } 私有映射 paramsFromRequest(HttpServletRequest 请求) { 映射参数 = new HashMap(); for (Entry entry : request.getParameterMap().entrySet()) { params.put(entry.getKey(), entry.getValue()[0]); } 返回参数;} } } 私有映射 paramsFromRequest(HttpServletRequest 请求) { 映射参数 = new HashMap(); for (Entry entry : request.getParameterMap().entrySet()) { params.put(entry.getKey(), entry.getValue()[0]); } 返回参数;} } } 私有映射 paramsFromRequest(HttpServletRequest 请求) { 映射参数 = new HashMap(); for (Entry entry : request.getParameterMap().entrySet()) { params.put(entry.getKey(), entry.getValue()[0]); } 返回参数;} }
**在您的计算机上重现问题:**
只需几分钟,您就可以通过以下简单步骤在任何计算机上重现问题: 1.)通过单击此链接从文件共享站点下载应用程序的压缩版本. 2.) 输入解压应用程序:`tar -zxvf oauth2.tar(2).gz` 3.) 导航到`oauth2/authserver` 启动`authserver`应用程序,然后输入`mvn spring-boot:run` . 4.) 通过导航到 `oauth2/resource` 然后输入 `mvn spring-boot:run` 来启动`resource`应用程序 5.) 通过导航到`oauth2/ui`然后输入`mvn`来启动`ui`应用程序spring-boot:run` 6.) 打开网络浏览器并导航到`http://localhost:8080` 7.) 点击`Login`,然后输入`Frodo`作为用户和`MyRing`作为密码,然后点击提交。8.) 输入“5309”作为“Pin Code”并点击提交。**这将触发上面显示的错误。** 您可以通过以下方式查看完整的源代码:a.) 将 maven 项目导入您的 IDE,或 b.) 在解压缩的目录中导航并使用文本编辑器打开。
您可以通过单击此链接 阅读文件共享站点上的所有 HTTP 标头和 Spring Boot 日志。
0 投票
0 回答
164 浏览

spring-security - 禁用 CSRF 时主体为空

我正在创建一个使用spring-boot-starter-securityspring-security-oauth2使用 Facebook 登录的 webapp。

为了避免在 Angular 2 中实现所有 CSRF 内容(并且因为它只是一个玩具项目),我想关闭 CSRF。
我已经实现了以下配置:

但现在Principal-Object 始终是null

为什么?
我想我无意中覆盖了我的 application.yaml 中配置的安全配置,但即使我添加了Order-Annotation 它也不起作用:(

编辑:
请求标头(我创建了一个过滤器来添加一个 XSRF-TOKEN cookie,忽略它):

0 投票
1 回答
252 浏览

spring - Spring Security、刷新令牌和 NotSerializableException

我有以下实体:

及相关驱动表:

当我尝试刷新令牌(/oauth/token?grant_type=refresh_token&client_id=abc&client_secret=abcd&refresh_token=...)时,我收到以下错误消息:

我该如何解决?这个问题的原因是什么?

Helpers.geometry 函数:

0 投票
0 回答
324 浏览

java - 如何在 WebSecurityConfigurerAdapter 和 ResourceServerConfigurerAdapter 之间设置 HttpSecurity

WebSecurityConfigurerAdapter定义ResourceServerConfigurerAdapter方法configure(HttpSecurity http)。但是,它们的运作方式似乎不同。例如,当我使用 时WebSecurityConfigurerAdapter,我不必定义AuthenticationProviderfor UsernamePasswordAuthenticationToken,这与我使用 in 时不同ResourceConfigurerAdapter。出于这个原因,我更喜欢使用 in 中的configure方法WebSecurityConfigurerAdapter,但是,在我的设置中同时使用两个配置器会导致异常,指出已经构建了一些 bean(我认为是springSecurityFilter)。我该如何解决这个冲突?

0 投票
0 回答
482 浏览

java - 如何使用 simpleJava 代码从 Spring Oath2 中的客户端获取 accessToken?

我是 Spring Oauth 的新手,我正在配置简单的 OauthServer 和资源服务器。

如何使用代码获取访问令牌?

使用下面的 curl 命令:

我得到以下回应:

如何使用客户端 Java 代码获得上述响应?我尝试的是下面,但它给出了 DefaultTokenService Null Pointer Exception 错误,但我不知道我是否使用了正确的方法。

0 投票
0 回答
465 浏览

java - 如何大摇大摆地传递access_token?

我配置了一个 oauth 2,它在没有 access_token 的情况下阻止所有 API。我想将具有长期有效性的 access_token 添加到 swagger ui 中,因此来自 swagger 的 api 调用工作正常。我对此进行了谷歌搜索,但没有找到任何最佳解决方案。下面是被告知代码片段。

但它不起作用。请在上面帮我

0 投票
1 回答
823 浏览

java - Spring Oauth 授权码配置

如何正确配置我的 jdbcAuthorizationCodeService?

所以这是我的配置要点

我的桌子是这样构造的

在此处输入图像描述

我的问题是。身份验证列的样本值应该是什么?因为它是 bytea,根据 spring oauth2 的要求