Zuul 作为 OAuth2 AuthServer 和 ResourceServer:共享 AuthenticationManager
Zuul as OAuth2 AuthServer and ResourceServer: share AuthenticationManager
我希望同时将 Zuul 代理作为 SSO @EnableOAuth2Sso
和资源服务器 @EnableResourceServer
。
经过一番研究,我在 Whosebug 和 github 上的这个可爱的 uaa-behind-zuul-sample 项目上发现了很多类似的问题。
- 我从
uaa-service
的 application.yml
中删除了用户和密码 属性
- 我添加了更多用户进行身份验证并禁用了 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);
}
- 使用
admin
和 user
凭据在 浏览器 中运行良好。所以那里授权没问题。
但是来自另一个客户的电话
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 found
。
user
和 password
也是如此。 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
轻松设置
解决方案是
公开来自 LoginConfiguration
的 AuthenticationManager
@Override
@豆
public AuthenticationManager authenticationManagerBean() 抛出异常{
return super.authenticationManagerBean();
}
将其注入 AuthorizationServerConfiguration
像这样
@Autowired
@Qualifier("authenticationManagerBean")
private AuthenticationManager authenticationManager;
- 我还在
DummyServiceApplication
中添加了一个仅供 ROLE_ADMIN
访问的受保护资源,它为 user
: 获取了 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 项目的支持,是他让我找到了解决方案
我希望同时将 Zuul 代理作为 SSO @EnableOAuth2Sso
和资源服务器 @EnableResourceServer
。
经过一番研究,我在 Whosebug 和 github 上的这个可爱的 uaa-behind-zuul-sample 项目上发现了很多类似的问题。
- 我从
uaa-service
的 - 我添加了更多用户进行身份验证并禁用了 parentAuthenticationManager
application.yml
中删除了用户和密码 属性
像这样
@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);
}
- 使用
admin
和user
凭据在 浏览器 中运行良好。所以那里授权没问题。
但是来自另一个客户的电话
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 found
。
user
和 password
也是如此。 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
解决方案是
公开来自
的 AuthenticationManagerLoginConfiguration
@Override @豆 public AuthenticationManager authenticationManagerBean() 抛出异常{ return super.authenticationManagerBean(); }
将其注入
AuthorizationServerConfiguration
像这样
@Autowired
@Qualifier("authenticationManagerBean")
private AuthenticationManager authenticationManager;
- 我还在
DummyServiceApplication
中添加了一个仅供ROLE_ADMIN
访问的受保护资源,它为user
: 获取了
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 项目的支持,是他让我找到了解决方案