当用户身份验证 e 将其保留到安全上下文中时,我该如何处理我的 Spring Boot 资源服务器 oauth 2 从 api 获取用户的额外数据?

如何解决当用户身份验证 e 将其保留到安全上下文中时,我该如何处理我的 Spring Boot 资源服务器 oauth 2 从 api 获取用户的额外数据?

我有一个使用 Spring Boot 完成的资源服务器。我正在使用 Spring Security 5.3 来验证和授权前端交换数据。我在 application.yml 中配置了一个授权服务器“issuer-uri”,它提供并验证 access_token (jwt)。

直到确定。授权服务器没有一次提供我在 access_token 或 id_token 中需要的每个用户信息的问题。使用 sub 声明和 access_token,我需要向端点发出请求以获取有关用户的更多额外数据。

我想知道我怎样才能在用户进行身份验证并将它们放入安全上下文中以获取该信息的请求与已经出现的信息一起使用。这样,我就可以在需要时在某些服务中获取该信息,而无需每次都向端点发出请求:

SecurityContextHolder.getContext().getAuthentication().getDetails()

这是我的 WebSecurityConfigurerAdapter

@Configuration
@EnableWebSecurity
public class WebSecurityConfig extends WebSecurityConfigurerAdapter {

  private static final String CLaim_ROLES = "role";
  private static final String AUTHORITY_PREFIX = "ROLE_";
  @Value("${sso.issuers_uri}")
  private String issuers;

  Map<String,AuthenticationManager> authenticationManagers = new HashMap<>();

  JwtIssuerAuthenticationManagerResolver authenticationManagerResolver =
        new JwtIssuerAuthenticationManagerResolver(authenticationManagers::get);


  @Override
  protected void configure(HttpSecurity http) throws Exception {
    String[] result = issuers.split(",");
    List<String> arrIssuers = Arrays.asList(result);

    arrIssuers.stream().forEach(issuer -> addManager(authenticationManagers,issuer));

    http
            .httpBasic().disable()
            .formLogin(AbstractHttpConfigurer::disable)
            .csrf(AbstractHttpConfigurer::disable)
            .authorizeRequests(auth -> auth
                    .antMatchers(
                            "/*","/signin-oidc","/uri-login_unico","/assets/**","/views/**","index.html","/api/segmentos/listar_publicados","/api/modelos","/api/modelos/*"
                    ).permitAll()
                    .antMatchers(
                            "/api/admin/**"
                    ).hasRole("role.PGR.Admin")
                    .antMatchers(
                            "/api/govbr/**"
                    ).hasAnyAuthority("ScopE_govbr_empresa")
                    .anyRequest().authenticated()
            ).oauth2ResourceServer(oauth2ResourceServer -> {
                oauth2ResourceServer.authenticationManagerResolver(this.authenticationManagerResolver);
            });
  }

  public void addManager(Map<String,AuthenticationManager> authenticationManagers,String issuer) {
    JwtAuthenticationProvider authenticationProvider = new JwtAuthenticationProvider(JwtDecoders.fromOidcIssuerLocation(issuer));
    authenticationProvider.setJwtAuthenticationConverter(getJwtAuthenticationConverter());
    authenticationManagers.put(issuer,authenticationProvider::authenticate);
  }

  private Converter<Jwt,AbstractAuthenticationToken> getJwtAuthenticationConverter() {
    JwtAuthenticationConverter jwtAuthenticationConverter = new JwtAuthenticationConverter();
    
  jwtAuthenticationConverter.setJwtGrantedAuthoritiesConverter(getJwtGrantedAuthoritiesConverter());
    return jwtAuthenticationConverter;
  }

  private Converter<Jwt,Collection<GrantedAuthority>> getJwtGrantedAuthoritiesConverter() {
    JwtGrantedAuthoritiesConverter converter = new JwtGrantedAuthoritiesConverter();
    converter.setAuthorityPrefix(AUTHORITY_PREFIX);
    converter.setAuthoritiesClaimName(CLaim_ROLES);
    return converter;
  }

}

我不知道我是否需要做一个自定义的 Authenticationmanger 或者我是否可以在通过身份验证后使用安全过滤器来做到这一点。如果有人能帮助我,我真的很感激。 TKS!!!

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其他元素将获得点击?
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。)
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbcDriver发生异常。为什么?
这是用Java进行XML解析的最佳库。
Java的PriorityQueue的内置迭代器不会以任何特定顺序遍历数据结构。为什么?
如何在Java中聆听按键时移动图像。
Java“Program to an interface”。这是什么意思?
Java在半透明框架/面板/组件上重新绘画。
Java“ Class.forName()”和“ Class.forName()。newInstance()”之间有什么区别?
在此环境中不提供编译器。也许是在JRE而不是JDK上运行?
Java用相同的方法在一个类中实现两个接口。哪种接口方法被覆盖?
Java 什么是Runtime.getRuntime()。totalMemory()和freeMemory()?
java.library.path中的java.lang.UnsatisfiedLinkError否*****。dll
JavaFX“位置是必需的。” 即使在同一包装中
Java 导入两个具有相同名称的类。怎么处理?
Java 是否应该在HttpServletResponse.getOutputStream()/。getWriter()上调用.close()?
Java RegEx元字符(。)和普通点?