gpt4 book ai didi

spring security oauth2 + 切换用户过滤器

转载 作者:行者123 更新时间:2023-12-02 05:45:52 25 4
gpt4 key购买 nike

我想在我的 spring-boot 应用程序中设置 SwitchUserFilter ,该应用程序还实现了 spring-security-oauth2 。我已在扩展 WebSecurityConfigurerAdapterWebSecurityConfiguration 中设置了此过滤器。

登录后,我获得了我的 token (不记名 token ),并使用配置的端点来切换用户。

我在 IDE 中跟踪代码并进行调试,显然 SecurityContextHolder 已更新,并且注入(inject)了新的目标用户。

但是,当请求重定向到目标 URL(此过滤器的属性)时,SecurityContextHolder 会返回旧用户,而不是我所请求的内容。

我已经检查了OAuth2AuthenticationProcessingFilter,从请求中提取的 token 返回相同的不记名 token ,并以此构建用户详细信息并将其注入(inject)SecurityContextHolder.

有没有办法将这种过滤器与 oauth2 方法一起使用?

最佳答案

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

我们的环境是带有 Angular 1.2 客户端的 spring-boot/jhipster 应用程序。

创建新 token :

@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;
}

这个新 token 将返回给客户端(在我们的例子中是 Angular 1.2 应用程序),客户端将 token 存储在其本地存储中(将在下一个请求中使用)。然后应用程序需要重新加载(更新目标用户的最简单方法):

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()
});
}

关于spring security oauth2 + 切换用户过滤器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38672084/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com