问题标签 [spring-security-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 回答
213 浏览

java - 如何配置spring oauth?

我有 2 个网络应用程序:

  1. 资源服务器 (@EnableResourceServer)
  2. 身份验证应用程序(@EnableAuthorizationServer)

它们被映射到一个数据库。

我想将数据库拆分为 2:一个用于客户端应用程序,第二个用于令牌。

我目前的流程:

  • 资源服务器获取带有令牌的请求
  • 春季安全检查数据库中的令牌

最好的流程可能是隔离身份验证应用程序和数据库,流程应该是这样的:

  • 资源服务器获取请求令牌
  • 并且资源服务器向身份验证 Web 应用程序(OAuth 服务器)发出请求以验证令牌
  • auth app (OAuth Server) spring 安全检查数据库中的令牌

?

如果我对 oauth 有任何误解,请告诉我。谢谢。

0 投票
1 回答
2690 浏览

spring - 使用 RemoteTokenService 时未获得客户端权限/角色

我正在使用 Spring-Security-OAuth2 来实现我自己的 oauth 服务器和资源服务器。我在我的 ResourceServer 上使用RemoteTokenServiceResourceServerTokenService的,它将使用CheckTokenEndpointOAuth 服务器上的 (/oauth/check_token) 对任何 accessToken 进行身份验证。

我已经为 api url 添加了一个 antMatcher,例如 /data/list 这将需要客户端应用程序角色/权限:“ ROLE_ADMIN ”像这样.antMatcher('/data/list').access("#oauth2.clientHasRole('ROLE_ADMIN')")

但它不工作。我在这个端点上做了一些试验和错误,我得到的结果如下:::

当 oauth 授权是仅限客户端时,即 client_credential 授权。我们从 /oauth/check_token 得到什么

我们没有得到任何客户授权。那么spring security如何执行上述授权检查"#oauth2.clientHasRole('ROLE_ADMIN')"

当 oauth 授予是用户 + 客户端时,即 Authorization_code 授予我们从 /oauth/check_token 获得的内容

对于authorization_code grnat,我们仍然没有获得客户端权限/角色。那么谁能告诉我我们如何在任何 api url 上执行 clientHasRole 身份验证?

0 投票
1 回答
1407 浏览

spring-security - 用于多个客户端应用程序的 RemoteTokenService

如何将 RemoteTokenService 用于多个客户端应用程序(具有不同的 client_id 和 secret )?

更新

这就是我们配置 RemoteTokenService 实例的方式。并将其注入 OAuth2AuthenticationManager 以用于单独的资源服务器和身份验证服务器。这是对的吗?

因此,当其他一些客户端必须访问此资源时,我如何为这两个客户端配置 RemoteTokenService。您能否对此有所了解。并告诉我我是否做错了什么。

0 投票
2 回答
3701 浏览

spring - Spring MVC 应用和 OAuth2 授权

我需要使用 oauth2 服务创建授权。我需要从中获取令牌,而不是在访问资源(REST 服务)时使用此令牌。我怎样才能做到这一点?起点是什么?看到例子会很棒。

0 投票
1 回答
253 浏览

spring - 没有xml的spring oauth2

我想了解如何使用 oauth2 spring 和 spring boot 在不使用 XML 的情况下创建提供程序和客户端。我有一个提供服务的提供者,但我如何从客户端访问它?

0 投票
0 回答
1722 浏览

spring-mvc - Spring OAuth2 未重定向到访问令牌

我一直在尝试配置 Spring OAuth2。已经部分成功。

为了测试我一直在使用 SOAPui 并将重定向 uri 设置为“urn:ietf:wg:oauth:2.0:oob”。

我的系统的问题是我可以去获取授权码,但它不会重定向到授权服务器来获取访问码。我一直在查看日志,发现那里没有定义 URL,它没有执行 /app/oauth/token?code=OB05Cb 而只是在 url 上执行 ?code=OB05Cb

调试:org.springframework.web.servlet.DispatcherServlet - 渲染视图 [org.springframework.web.servlet.view.RedirectView:未命名;网址 [urn:?code=OB05Cb]]

然后它显示在我的 SoapUI 上找不到的页面并停止工作流。

我相信我错过了一些没有这样做的拦截器。我不知道为什么它没有前进。谁能给我一些提示?谢谢!

我正在使用 Spring OAuth2 版本 2.0.3.RELEASE 4.0.5.RELEASE 3.2.5.RELEASE

这是我的配置文件。

0 投票
1 回答
5492 浏览

spring - 重定向到访问令牌入口点 Oauth 令牌的问题

我在重定向到访问令牌入口点 /oauth/token 时遇到问题,这将在下面详细说明。我希望有人能给我一些启示,因为我花了很多时间来实现它。

此外,有趣的是,即使按照他们的说明,我也无法使用 SoapUI 5.0 社区版进行测试。它获取授权代码,但稍后失败,因为您需要将重定向 URI 设置为“urn:ietf:wg:oauth:2.0:oob”。

由于 Spring-Security-Oauth2 缺乏很多好的文档,而且我花了很多时间调试和记录工作,我决定在这里分享我的评论和配置代码,这可能对其他人也有帮助。

我在我的 pom 上使用以下依赖项版本:

现在,想法是使用 Cassandra 作为持久性存储来实现所有 clientId 对象、UserPrincipal、访问、nonce 和令牌存储。所有这些组件都运行良好并经过测试。事实上,它获取所有的身份验证/授权,创建授权代码。

我最近在 Spring Oauth2 github 上测试 JDBC 存储时看到了一个错误,但这与测试而不是实际实现有关,特别是因为不使用 JDBC。

我编写了一个客户端 Web 应用程序来访问与 OAuth2 服务器和 Spring Security 一起登录的 REST 资源。一切顺利,直到我向 /oauth/token 请求访问令牌。

当我首先点击安全的 Rest 服务时,它会正确地开始进行重定向并执行 DefaultOAuth2RequestFactory createAuthorizationRequest() 方法。使用存储中的秘密等完美加载 ClientDetails 对象。因此它具有 Oauth2 客户端的所有范围、授权等。它还正确验证了 redirectURIParameter 并解析了重定向。然后它转到 TokenStoreUserApprovalHandler 并创建 OAuth2Request 对象。然后,当然会尝试查找工作流中尚不存在的现有访问令牌。它从 authenticationKeyGenerator 创建 authenticationkey 并查询此时正确返回 null 的存储。然后它重定向回 /oauth/authorize 两次,第二次它有一个授权码并在approveOrDeny() 方法中标记为已批准(AuthorizationEndPoint)。authorizationCodeServices 创建代码并将其正确存储在我的 Cassandra 存储中。

此时它调用 ( AuthorizationEndPoint)getSuccessfulRedirect()将状态参数添加到模板。

然后它调用(OAuth2RestTemplate类)getAccessToken()方法。由于访问令牌很好且有效,因此它调用acquireAccessToken()返回一个accessTokenRequestwith {code=[Q19Y6u], state=[1PyzHf]}。然后它调用 以accessTokenProvider在 获取访问令牌obtainAccessToken()。然后调用OAuth2AccessTokenSupportretrieveToken()方法中调用。并在getRestTemplate. 使用AuthorizationCodeResourceDetails授权类型完美创建authorization_code,它同时具有authorizationSchemeclientAuthenticationScheme作为标题。clientId是正确的clientSecretAuthorizationCodeResourceDetailsisoAuth2ClientBeanuserAuthorizationURIis 的 id http://myhost.com:8080/MyAPI/oauth/authorize。标题显示为

提取器是org.springframework.security.oauth2.client.token.OAuth2AccessTokenSupport。形式是{grant_type=[authorization_code], code=[Xc7yni], redirect_uri=[http://myhost.com:8080/OAuthClient/support]}

然后应用程序冻结并显示在日志中:

然后我的客户端 Web 应用程序出现以下异常:

现在,我相信我的 OAuth2 和 Spring Security 的 xml 配置有一些问题。所以配置文件如下。

我确实有一些关于它的问题,所以这里首先是问题:

1)<oauth2:authorization-server>我不确定我是否正确配置了这个。请查看我对我的 xml 文件的评论。我添加了指向我的 userAuthenticationManager bean 的 authentication-request-manager-ref 参数,这是一个身份验证管理器,它采用身份验证提供者 user-service-ref="userService"

2) authentication-manager oauthClientAuthenticationManager 在“/oauth/token”被拦截时使用。这定义如下:

3) 我定义了以下在 sec:global-method-security 中使用的 methodSecurityExpressionHandler bean。不确定这是否正确。

4)我还有一个我认为不推荐的bean“clientCredentialsTokenEndpointFilter”。我将其用作入口点“/oauth/token”的自定义过滤器,但我认为这是错误的。

5) 现在是 Oauth 令牌端点:这是端点 /oauth/token 因为我在这里有很多问题:

  1. 这是永远达不到的。
  2. 我应该有一个喜欢的自定义过滤器clientCredentialsTokenEndpointFilter吗?
  3. 我必须有一个 http-basic 入口点吗?
  4. 我应该有一个访问属性,IS_AUTHENTICATED_FULLY或者我可以使用我在我的UserPrincipal对象上定义的权限,比如OAUTH_CLIENT我在那里添加的权限吗?
  5. 会议呢?我应该说“无国籍”还是“从不”
  6. 我也应该添加corsFilter它吗?
  7. 入口点是否正确?哪个是OAuth2AuthenticationEntryPoint班级?
  8. 我必须添加 csrf 令牌吗?我相信不会,因为它会限制它更多。
  9. 表达式处理程序是否正确org.springframework.security.oauth2.provider.expression.OAuth2WebSecurityExpressionHandle
  10. 我可以将 authentication-manager-ref 从更改oauthClientAuthenticationManageruserAuthenticationManager.

<sec:http use-expressions="true" create-session="stateless" authentication-manager-ref="userAuthenticationManager" entry-point-ref="oauthAuthenticationEntryPoint" pattern="/oauth/token"> <sec:intercept-url pattern="/oauth/token" access="hasAuthority('OAUTH_CLIENT')" /> <!-- <sec:intercept-url pattern="/oauth/token" access="IS_AUTHENTICATED_FULLY" /> --> <sec:http-basic entry-point-ref="oauthAuthenticationEntryPoint"/> <!-- <sec:http-basic/> --> <sec:anonymous enabled="false" /> <sec:custom-filter ref="clientCredentialsTokenEndpointFilter" after="BASIC_AUTH_FILTER" /> <sec:access-denied-handler ref="oauthAccessDeniedHandler" /> <sec:expression-handler ref="webSecurityExpressionHandler" /> <!-- <sec:custom-filter ref="corsFilter" after="LAST"/> --> </sec:http>

我想在这里添加完整的配置文件,但有一个限制。

0 投票
1 回答
2280 浏览

spring - 请求访问令牌 OAuth2 Spring 实现时出现 500 http 错误

这是重定向到访问令牌入口点 Oauth Token的问题序列。

我在修复其中一些问题上得到了帮助,但是我现在在访问 /oauth/token 时遇到了授权/权限错误。我正在使用 Spring 4.0.5.RELEASE、Spring-Security 3.2.5.RELEASE,现在使用 Spring-Oauth2 2.0.4-build 代替 2.0.3.RELEASE。

错误如下,我怀疑入口点安全性或 oauth2:authorization-server 有问题。

这是我的授权服务器设置:

我的 userAuthenticationManager 密码是:

其中 userService 是 UserDetailsS​​ervice 的实现。

对于模式 =“/oauth/token”,我有访问权限 =“hasAuthority('OAUTH_CLIENT')”,我在用户角色上定义了它。我也有会话创建会话 =“无状态”和我的身份验证管理器- ref="oauthClientAuthenticationManager"。oauthClientAuthenticationManager 作为身份验证提供者 user-service-ref="clientDetailsUserService" 是 UserDetailsS​​ervice 实现。我有 entry-point-ref="oauthAuthenticationEntryPoint" 这是 org.springframework.security.oauth2.provider.error.OAuth2AuthenticationEntryPoin‌​t 和不改变领域或类型名称。

我也有 。clientAuthenticationEntryPoint 也是 OAuth2AuthenticationEntryPoint 但我将 typeName 设置为 Basic 而 Realm 保持默认的 oauth。

我也设置

其中 clientCredentialsTokenEndpointFilter 是 org.springframework.security.oauth2.provider.client.ClientCredentialsTokenEndpoi‌​ntFilter 与 oauthClientAuthenticationManager 作为身份验证管理器。

我也有

oauthAccessDeniedHandler = org.springframework.security.oauth2.provider.error.OAuth2AccessDeniedHandler。而 webSecurityExpressionHandler = org.springframework.security.oauth2.provider.expression.OAuth2WebSecurityExpress‌​ionHandler

另外我的切入点如下:

其中 clientCredentialsTokenEndpointFilter 定义为:

有什么建议吗?谢谢。

0 投票
1 回答
807 浏览

spring-security - 没有共享数据源的分离资源和授权服务器

我有兴趣实现单独的资源和授权服务器。从这里了解,要使其工作,“令牌必须可以由资源服务器在本地解码,或者它必须与身份验证服务器共享存储。” 将近 2.5 年后,我希望资源服务器可以在不与授权服务器共享数据源的情况下将令牌解析为 Principal。如问题所述,RemoteTokenServices是实现此目的的唯一方法吗?如果是这样,“/check_token”的响应应该是什么?

0 投票
1 回答
3148 浏览

spring - @AuthenticationPrincipal 对象返回会话值

@AuthenticationPrincipal 对象返回之前存储在会话中的值。

Spring Boot + Spring Security oauth REST 服务器。https://github.com/legshort/spring-boot-sample

这两种 REST 方法在控制器中。问题是当我运行测试代码时,deleteUser() 处的最后一个参数 userDetailsImpl 与 updateUser() 处的 userDetailsImpl 的值相同。

下面是控制器测试代码

我不知道第二个请求 testDeleteUser() 如何具有会话值,并且它是使用先前测试的同一用户。因此,即使在 deleteUser() 的开头验证访问令牌并加载正确的新用户,但 userDetailsImpl 的实际值在 testUpdateUser() 的开头创建了错误的用户。

这是 UserDetailService 实现,当涉及到 loadUserByUserName() 来验证访问令牌时,它会从数据库中加载正确的用户并返回刚刚在每个测试方法开始时创建的新用户(signUpUser())。

我试图禁用我失败的会话,对我来说配置和测试代码似乎很好。spring-security-oauth 有什么好的实际例子吗?


更新

  1. 据我了解 mockMvc 是,它清除所有设置,并且每次使用 setUp() 方法创建几乎新的模拟服务器。因此,每次都应该清除访问令牌存储,但令牌存储会以某种方式维护经过身份验证的令牌。

  2. 在测试期间询问使用“/oauth/token”请求的访问令牌,以下是调用 InMemoryTokenStore 的方式。


测试过程日志

  1. testUpdateUser() -> POST:/oauth/token -> 存储令牌
    令牌:50b10897-9e15-4859-aeb0-43d0802ba42c
    用户:id=2

  2. testUpdateUser() -> PUT: /users/2 -> 读取令牌
    令牌:50b10897-9e15-4859-aeb0-43d0802ba42c
    用户:id=2

  3. testUpdateUserWithWrongUserId() -> GET: /oauth/token -> 存储令牌
    令牌:50b10897-9e15-4859-aeb0-43d0802ba42c -> 已经存在于令牌
    用户中:id=2 -> id=4: 用户已更新为新用户

  4. testUpdateUserWithWrongUserId() -> PUT:/users/0 -> 读取令牌
    令牌:50b10897-9e15-4859-aeb0-43d0802ba42c
    用户:id=2

  5. testDeleteUser() -> GET: /oauth/token -> 没有存储令牌,应该存储令牌

  6. testDeleteUser() -> DELETE: /users/5 -> 读取令牌
    令牌:50b10897-9e15-4859-aeb0-43d0802ba42c
    用户:id=2 -> 用户应该是 id=5,它是用 userSignUp() 创建的


问题
如何使用 mockMvc 清除每个测试方法的 InMemoryTokenStore?