Как получить зарегистрированный идентификатор пользователя в REST API - PullRequest
0 голосов
/ 27 апреля 2020

Я создал приложение Java с соглашением REST API. Я работаю с конечной точкой, которая возвращает объекты, только если объект связан с пользователем общим идентификатором в базе данных (аннотация ManyToOne). Чтобы добиться этого, мне нужен текущий зарегистрированный идентификатор пользователя для сопоставления его с идентификатором пользователя объекта. Если идентификаторы одинаковы, конечная точка возвращает данные. Я знаю решения как классы «Principal» или «Authentication», но они предоставляют все, кроме «id». Я использовал Spring Security http Basi c для аутентификации. Мои классы аутентификации:


@Component
public class CustomAuthenticator implements AuthenticationProvider {

    private final UserRepository userRepository;

    private final PasswordEncoder passwordEncoder;

    @Autowired
    public CustomAuthenticator(UserRepository userRepository, @Lazy PasswordEncoder passwordEncoder) {
        this.userRepository = userRepository;
        this.passwordEncoder = passwordEncoder;
    }

    @Override
    public Authentication authenticate(Authentication authentication) throws AuthenticationException {

        String login = authentication.getName();
        String password = authentication.getCredentials().toString();

        User user = userRepository.findByLogin(login).orElseThrow(() -> new EntityNotFoundException("User not found"));
        if (!passwordEncoder.matches(password, user.getPassword())) {
            throw new BadCredentialsException("Bad credentials");
        }

        return new UsernamePasswordAuthenticationToken(login, password, convertAuthorities(user.getRoles()));

    }

    private Set<GrantedAuthority> convertAuthorities(Set<UserRole> userRoles) {
        Set<GrantedAuthority> authorities = new HashSet<>();
        for (UserRole ur : userRoles) {
            authorities.add(new SimpleGrantedAuthority(ur.getRole().toString()));
        }
        return authorities;
    }

    @Override
    public boolean supports(Class<?> authentication) {
        return authentication.equals(UsernamePasswordAuthenticationToken.class);
    }
}

КЛАСС КОНФИГ. БЕЗОПАСНОСТИ:


@EnableGlobalMethodSecurity(prePostEnabled = true)
@EnableWebSecurity
@Configuration
public class SecurityConfig extends WebSecurityConfigurerAdapter {

    private final CustomAuthenticator customAuthenticator;

    public SecurityConfig(CustomAuthenticator customAuthenticator) {
        this.customAuthenticator = customAuthenticator;
    }

    @Bean
    public PasswordEncoder passwordEncoder() {
        PasswordEncoder passwordEncoder = PasswordEncoderFactories.createDelegatingPasswordEncoder();
        return passwordEncoder;
    }

    @Override
    protected void configure(HttpSecurity http) throws Exception {
        http
                .authorizeRequests()
                .antMatchers("/").permitAll()
                .antMatchers("/api").permitAll()
                .antMatchers("/api/register").permitAll()
                //TODO everybody now has access to database, change it later
                .antMatchers("/h2-console/**").permitAll()
                .anyRequest().authenticated()
                .and()
                .httpBasic();

        http
                .csrf().disable()
                .headers().frameOptions().disable();
    }

    @Override
    protected void configure(AuthenticationManagerBuilder auth) throws Exception {
        auth.authenticationProvider(customAuthenticator);
    }
}

Кто-нибудь знает, как решить эту проблему?

1 Ответ

1 голос
/ 27 апреля 2020

Вы можете использовать класс UserDetails и установить идентификатор для поля username, этот класс обеспечивает безопасность пружин.

Если вам не нужно это решение, вы можете создать класс Subclass extend UserDetails и решить поле идентификатора. При получении запроса анализируйте принципал на UserDetails или subclass extends UserDetails, чтобы получить идентификатор

Пример:

Authentication authentication = SecurityContextHolder.getContext().getAuthentication();
UserDetails userPrincipal = (UserDetails)authentication.getPrincipal();
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...