spring-boot - 如何在zuul代理spring boot、Sprng security、spring-security-oauth2的下游服务器中获取Security Principal值
问题描述
我使用 spring boot、Spring security、Spring oauth2、Eureka server 和 Zuul Proxy 创建了微服务。我创建了下面给出的三个项目。
- register-Eureka:用于在 Eureka 服务器中注册我的服务。
gatway-Zuul:我实现了zuul代理服务器,spring security和spring-security-oauth2。它工作正常,令牌正在生成,它也成功地将请求转发到其他微服务。
micorest:第三个微服务用于创建运行良好的宁静服务。
问题:我需要在 micorest 项目控制器上获取登录用户详细信息,但我不知道如何获取它。
我试图通过使用 Principal 类来获得它。
@RequestMapping(value = "/user", method = RequestMethod.GET)
public User getUser(Principal principal)
{
try
{
System.out.println("fine here mueraza"+principal.getName());
}
catch(Exception e) {
System.out.println("fine here mueraza===========principal is null==============");
}
return new User();
}
我使用 Principal 来获取值,但它总是 cumming null
@SpringBootApplication
@EnableDiscoveryClient
@EnableZuulProxy
public class GatewayZullApplication {
public static void main(String[] args) {
SpringApplication.run(GatewayZullApplication.class, args);
}
}
Aouth2 配置
@Configuration
@EnableOAuth2Client
@EnableAuthorizationServer
public class AuthorizationServerConfig extends AuthorizationServerConfigurerAdapter {
private static String REALM="microclient";
private static final int ONE_DAY = 60 * 60 * 24;
private static final int THIRTY_DAYS = 60 * 60 * 24 * 30;
@Autowired
private TokenStore tokenStore;
@Autowired
private UserApprovalHandler userApprovalHandler;
@Autowired
@Qualifier("authenticationManagerBean")
private AuthenticationManager authenticationManager;
@Override
public void configure(ClientDetailsServiceConfigurer clients) throws Exception {
clients.inMemory()
.withClient("microclient")
.secret("{noop}secret")
.authorizedGrantTypes("password", "refresh_token")
.authorities("ROLE_CLIENT", "ROLE_TRUSTED_CLIENT")
.scopes("read", "write", "trust")
//.accessTokenValiditySeconds(ONE_DAY)
.accessTokenValiditySeconds(6000)
.refreshTokenValiditySeconds(THIRTY_DAYS);
}
@Override
public void configure(AuthorizationServerEndpointsConfigurer endpoints) throws Exception {
endpoints.tokenStore(tokenStore).userApprovalHandler(userApprovalHandler)
.authenticationManager(authenticationManager);
}
@Override
public void configure(AuthorizationServerSecurityConfigurer oauthServer) throws Exception {
oauthServer.realm(REALM);
}
}
解决方案
您可以从 Jwt 令牌中获取委托人。 将用户实体加载到 Jwt 令牌声明。
如果您需要从任何服务访问用户实体详细信息:
- 从请求标头中获取令牌。
- 使用正确的签名密钥解析令牌并获取用户详细信息。
推荐阅读
- ruby - aws-sdk-core/xml/parser.rb:74:in `set_default_engine': 找不到兼容的 xml 库),Ruby 版本 3.0.2
- matlab - Matlab:在背景灰色图像上绘制彩色线,同时保留颜色条信息
- azure - 围绕基于 Azure 的集成平台进行应用程序集成的通用数据模型
- reactjs - 我正在使用带有切换按钮的确认模式。当用户选择“是”时它工作正常,但当用户选择“否”时它仍然会改变状态
- javascript - found: object with keys {input} 如果你打算渲染一组子元素,请使用数组。这段代码是什么意思?
- ios - 取消后的Swift UI NWConnection连接
- git - 如何从 GitHub 模板导入更改?
- sas - 将多个文本 (txt) 文件导入 SAS(文件在前 2 行具有可变属性)
- string - 在 Lua 中添加方法到字符串并修改 self
- visual-studio-code - Azure Functions 在 vs 代码中缺少程序集引用