Zuul 作为 OAuth2 AuthServer 和 ResourceServer:共享 AuthenticationManager

Zuul as OAuth2 AuthServer and ResourceServer: share AuthenticationManager

我希望同时将 Zuul 代理作为 SSO @EnableOAuth2Sso 和资源服务器 @EnableResourceServer

经过一番研究,我在 Whosebug 和 github 上的这个可爱的 uaa-behind-zuul-sample 项目上发现了很多类似的问题。

  1. 我从 uaa-service
  2. application.yml 中删除了用户和密码 属性
  3. 我添加了更多用户进行身份验证并禁用了 parentAuthenticationManager

像这样

@Override
protected void configure(AuthenticationManagerBuilder auth) throws Exception {
    auth
      .inMemoryAuthentication()
      .withUser("user").password("password").roles("USER")
      .and()
      .withUser("admin").password("admin").roles("ADMIN");
      // Disables this line below:
      //  auth.parentAuthenticationManager(authenticationManager);
}
  1. 使用 adminuser 凭据在 浏览器 中运行良好。所以那里授权没问题。

但是来自另一个客户的电话 curl --insecure -H "Authorization: Basic $(echo -n 'acme:acmesecret' | base64)" http://localhost:8765/uaa/oauth/token -d grant_type=password -d username=admin -d password=admin -v

结果 {"error":"invalid_grant","error_description":"Bad credentials"}

随着日志消息: o.s.s.a.dao.DaoAuthenticationProvider : User 'admin' not founduserpassword 也是如此。 And 如果我保留 application.yml 中定义的用户,我会工作。

问题: 是否可以与 AuthorizationServerConfigurerAdapter 共享 WebSecurityAdapter 的身份验证管理器?以便它们以相同的方式配置?

@Override
public void configure(AuthorizationServerEndpointsConfigurer endpoints) throws Exception {           
  endpoints
  // TODO here: use the authenticationManager from the other class 
    .authenticationManager(authenticationManager)
    .accessTokenConverter(jwtAccessTokenConverter());
}

我用一个单独的分支 https://github.com/mavogel/uaa-behind-zuul-sample/tree/integration-resource-server 分叉了上面提到的项目,可以通过 运行 ./build_run.sh

轻松设置

解决方案是

  1. 公开来自 LoginConfiguration

    的 AuthenticationManager

    @Override @豆 public AuthenticationManager authenticationManagerBean() 抛出异常{ return super.authenticationManagerBean(); }

  2. 将其注入 AuthorizationServerConfiguration

像这样

@Autowired
@Qualifier("authenticationManagerBean")
private AuthenticationManager authenticationManager;
  1. 我还在 DummyServiceApplication 中添加了一个仅供 ROLE_ADMIN 访问的受保护资源,它为 user:
  2. 获取了 ACCESS_DENIED

像这样

@PreAuthorize("#oauth2.hasScope('openid') and hasRole('ROLE_ADMIN')")
@RequestMapping(value = "secret", method = RequestMethod.GET)
@ResponseBody
public String helloSecret(Principal principal) {
    return principal == null ? "Hello anonymous" : "S3CR3T  - Hello " + principal.getName();
}

对 PiggyMetrics 项目的支持,是他让我找到了解决方案