Spring boot создать пользовательскую аннотацию для входа в систему пользователя? - PullRequest
1 голос
/ 01 февраля 2020

У меня есть модель сущности с именем 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, которая дает мне в настоящее время зарегистрированного пользователя (если не выдает исключение, которое я могу поймать в совете контроллера)?

Примечание: Как получить пользователя, зависит от меня. В приведенном выше примере я использую authenticntcation.getName (), а затем запрашиваю мою базу данных для создания сущности пользователя. Но я могу использовать любой другой способ сделать это. Я просто хочу создать аннотацию наподобие CurrentUser, а затем добавить код (для извлечения пользователя) за ней.

1 Ответ

0 голосов
/ 01 февраля 2020

Добавьте следующий компонент:

(измените 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 {}

...