gpt4 book ai didi

java - Spring Boot创建自定义注释来获取登录用户?

转载 作者:太空宇宙 更新时间:2023-11-04 09:07:52 24 4
gpt4 key购买 nike

我有一个名为User的实体模型。我已经实现了 UserDetailsS​​ervice 并在 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 或注释,让我可以访问登录用户,以便我可以在任何地方使用它,如下所示在我的 Controller 中?

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来为我提供当前登录的用户(如果没有抛出异常,我可以在 Controller 建议中捕获该异常)?

注意:如何获取用户取决于我。在上面的示例中,我使用 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 {}

关于java - Spring Boot创建自定义注释来获取登录用户?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60011282/

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