Spring 引导创建自定义注释以获取登录用户?

Spring boot create a custom annotation to get logged in user?

我有一个名为 User 的实体模型。我已经实现了 UserDetailsService 并像这样在 WebSecurityConfig 中使用它。为简洁起见删除了不必要的代码。

@Configuration
@EnableWebSecurity
@EnableGlobalMethodSecurity(prePostEnabled = true)
public class WebSecurityConfig extends WebSecurityConfigurerAdapter {
    @Override
    public void configure(AuthenticationManagerBuilder authenticationManagerBuilder) throws Exception {
        authenticationManagerBuilder.userDetailsService(userDetailsService).passwordEncoder(passwordEncoder());
    }

    @Bean
    @Override
    public AuthenticationManager authenticationManagerBean() throws Exception {
        return super.authenticationManagerBean();
    }
}

现在在请求-响应期间的任何地方,我都可以使用此代码获取当前登录的用户

Authentication auth = SecurityContextHolder.getContext().getAuthentication();
String username = auth.getName();
// now use some jpa logic to retrive User entity using above username

现在我的问题是,是否有任何方法可以创建自定义 AOP 或注释,使我能够访问已登录的用户,以便我可以像在我的控制器中那样在任何地方使用它,如下所示?

public class LoginController {
    public String response(@CurrentUser User user) {
        // do logic once you have access to logged in user with help of @CurrentUser annotation
    }
}

所以就像上面的例子一样,我可以创建一个注释 @CurrentUser 给我当前登录的用户(如果没有抛出异常,我可以在控制器建议中捕获)?

注意:我如何获得用户取决于我。在上面的示例中,我使用 authentcation.getName() 然后查询我的数据库以构建用户实体。但我可以使用任何其他方式来这样做。我只想创建一个像 CurrentUser 这样的注释,然后在它后面添加代码(检索用户)。

添加以下 bean:

(如果您为委托人使用不同的实体,请更改 UserDetail)。

  @Bean
  public Function<UserDetails, User> fetchUser() {
    return (principal -> {
      String name = principal.getUsername()
      //do JPA logic
      return ...
    });
  }

然后设置 @CurrentUser 注释如下:

@Retention(RetentionPolicy.RUNTIME)
@Inherited
@Documented
@AuthenticationPrincipal(expression = "@fetchUser.apply(#this)", errorOnInvalidType=true)
public @interface CurrentUser {}