将 @AuthenticationPrincipal 与 JwtAuthenticationToken 一起使用以使用自己的用户类

2024-06-25

我正在使用 Spring Boot 2.2.5 和 Spring Security 5.2.2spring-security-oauth2-resource-server and spring-security-oauth2-jose依赖关系。

在我的控制器方法中,我可以这样做:

@GetMapping
public ResponseEntity<?> doSomething(@AuthenticationPrincipal JwtAuthenticationToken principal) {
    User user = getUser(principal);
    ...
}

The principal被注入并包含 Azure 上用户的 ID(我使用的是 Azure AD B2C)。

在每种方法中我需要做的第一件事就是获取我自己的方法User对象使用此私有方法检索User从我的userService春豆:

    private User getUser(JwtAuthenticationToken principal) {
        AuthorizationServerUserId authorizationServerUserId = AuthorizationServerUserId.fromPrincipal(principal);
        return userService.findByAuthorizationServerUserId(authorizationServerUserId)
                          .orElseThrow(() -> UserNotFoundException.forAuthorizationServerUserId(authorizationServerUserId));
    }

我如何配置 Spring (Boot) 才能使其正常工作:

@GetMapping
public ResponseEntity<?> doSomething(@AuthenticationPrincipal User user) {

}

目前安全配置是这样完成的:

@EnableWebSecurity
@EnableGlobalMethodSecurity(prePostEnabled = true, securedEnabled = true)
public class WebSecurityConfiguration extends WebSecurityConfigurerAdapter {

    @Override
    protected void configure(HttpSecurity http) throws Exception {
        http.sessionManagement()
                .sessionCreationPolicy(SessionCreationPolicy.STATELESS)
                .and()
                .oauth2ResourceServer(OAuth2ResourceServerConfigurer::jwt)
                .authorizeRequests(registry -> {
                    registry.antMatchers("/registration/**").permitAll();

                    registry.antMatchers("/api/**").authenticated();
                });
    }
}

@AuthenticationPrincipal接受 SpEL 表达式作为参数。

您可以指定将主体转换为User在提供的 SpEL 表达式中。

@GetMapping
public ResponseEntity<?> doSomething(@AuthenticationPrincipal(expression = "@userService.getUser(#this)") User user) {

}

where userService指的是UserService bean.

您可以通过创建使用的自定义注释来更进一步@AuthenticationPrincipal作为元注释。

@Target({ElementType.PARAMETER, ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Documented
@AuthenticationPrincipal(expression = "@userService.getUser(#this)")
public @interface CurrentUser {}

那么你的控制器就会变成

@GetMapping
public ResponseEntity<?> doSomething(@CurrentUser User user) {

}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

将 @AuthenticationPrincipal 与 JwtAuthenticationToken 一起使用以使用自己的用户类 的相关文章

随机推荐