当前位置: 首页 > 知识库问答 >
问题:

spring security oauth2+开关用户筛选器

秦俊发
2023-03-14

我已经检查了OAuth2AuthenticationProcessingFilter和从request中提取的令牌,它返回了一个相同的承载令牌,并以此构建用户详细信息并将其注入到SecurityContextHolder中。

有没有什么方法可以将这种过滤器与oauth2方法一起使用?

共有1个答案

朱硕
2023-03-14

问题是您需要创建一个包含新目标用户信息的新令牌。这个新令牌必须发送回客户端,因此对于以后的请求,将使用新的目标用户令牌。在我们的示例中,令牌被持久化在服务器端(使用JDBCTokenStore),但它也可以在完全服务器端的无状态环境(JWT-Token)中工作。

我们的环境是一个带有angular 1.2客户端的Spring-boot/jhipster应用程序。

正在创建新令牌:

@Inject
private UserDetailsService userDetailsService;

@Inject
private AuthorizationServerTokenServices tokenService;

@Inject
private ClientDetailsService clientDetailsService;


   public OAuth2AccessToken createImpersonationAccessToken(String login) {
       UserDetails userDetails = userDetailsService.loadUserByUsername(login);
       log.info("Switching current user to {}", login);

       Collection<? extends GrantedAuthority> authorities = userDetails.getAuthorities();
       List<GrantedAuthority> impersonationAuthorities = new ArrayList<>(authorities);
       Authentication source = SecurityContextHolder.getContext().getAuthentication();
       // add current user authentication (to switch back from impersonation):
       SwitchUserGrantedAuthority switchUserAuthority = 
               new SwitchUserGrantedAuthority(AuthoritiesConstants.IMPERSONATION, source);
       impersonationAuthorities.add(switchUserAuthority);
                   UserDetails newUserDetails = 
               org.springframework.security.core.userdetails.User
               .withUsername(login)
               .authorities(impersonationAuthorities)
               .password("justinventedhere")
               .build();
                           Authentication userPasswordAuthentiation = 
               new UsernamePasswordAuthenticationToken(newUserDetails, null, impersonationAuthorities);

       Map<String, String> parameters = new HashMap<>();        
       ClientDetails client = clientDetailsService.loadClientByClientId(clientId);
                   OAuth2Request oauthRequest = new OAuth2Request(parameters, client.getClientId(), client.getAuthorities(), true, 
               client.getScope(), client.getResourceIds(), null, null, null);
       OAuth2Authentication authentication = new OAuth2Authentication(oauthRequest, userPasswordAuthentiation);
       OAuth2AccessToken createAccessToken = tokenService.createAccessToken(authentication);
                   return createAccessToken;
   }
vm.switchToClient = function (client) {
    vm.switchingUser = true;
    UserService.switchToClient(client, function(response) {
                var expiredAt = new Date();
                $localStorage.authenticationToken = response;
                window.location.href='#/';
                window.location.reload()
            });
}
 类似资料:
  • 根据下面的讨论 ZMQ可以通过pub-sub套接字将消息发布到特定的客户端吗?

  • 我们首先需要在 UserDefinition 加载并缓存租户用户。 打开 Multitenancy.Web/ Modules/ Administration/ User/ Authentication 下的 UserDefinition.cs,并添加 TenantId 属性。 namespace MultiTenancy.Administration { using Serenity;

  • 我正在使用spring cloud网关过滤器,希望通过过滤请求,但order不使用注释 我试着交换过滤器的顺序,但不起作用。 我期望输出: 但实际输出:

  • 应用筛选器之前的示例使用者记录是(在值中查找GP_ID): 当我在kafkaListenerContainerFactory()中按如下方式设置recordFilterStrategy时: KafKareCordvo.ConvertByteBufferToLong正在将bytebuffer值转换为long值。 但是,当它被Kafka听众按以下方式消费时: 这将返回删除我筛选的字段值的记录:“gp_

  • 首先,我试图使选择所有复选框,如果我单击表头中的选择所有复选框,整个表行将选择并显示一个复选框反向消息,即我选择了多少复选框。这里的问题是,如果我单击select all复选框,反向消息不会显示楼上的表,即我选择了多少行。 其次,如果我从任何列中筛选任何数字,相同的数字将显示同一列中有多少行具有相同的数字。如果我选中了所有复选框,那么反向消息将显示我选中了多少行复选框。这里,问题是显示整个表行计数

  • 我有一个Spring boot API,我设法用oAuth2和Google来保护它。我有类似的东西:Rest,Spring自己的OAuth2服务器OAuth2提供商,如脸书,谷歌,雅虎 一切按预期运行。 我的问题是这样的:我如何知道限制某些用户(不是每个谷歌用户)的访问?对我来说这听起来像是授权部分。我不知道从哪里开始,因为在这方面我是个初学者。 感谢任何帮助或指点。