Несколько стратегий аутентификации в весенней безопасности при загрузке - PullRequest
0 голосов
/ 21 ноября 2018

Чтобы использовать пользовательскую аутентификацию в весенней безопасности, вы должны реализовать интерфейс UserDetailsService и переопределить метод loadUserByUsername, например, приведенный ниже пример

public class UserServiceImpl implements UserDetailsService{

    @Autowired
    private UserDao userDao;

    @Override
    public UserDetails loadUserByUsername(String useremail)
            throws UsernameNotFoundException {
        Users user = userDao.findByUserEmail(useremail);
        if(user == null){
            throw new UsernameNotFoundException("UserName or Password Invalid.");
        }
        return new org.springframework.security.core.userdetails.User(user.getUsername(), user.getPassword(), user.getEnabled(), true, true, true, getGrantedAuthorities(userDao.getUserRole(user.getUsersId())));
    }

и его корректную работу длявесь веб-сайт.

что я хочу сейчас сделать - это открыть спокойный веб-сервис с того же хоста, и все запросы для этого WS будут проходить через /api/** с другим типом аутентификации (например, с использованием токенов) возможно ли это сделать?и если да, есть ли идея, как это сделать?какие-нибудь полезные ресурсы?

1 Ответ

0 голосов
/ 22 ноября 2018

Вы можете начать с создания класса конфигурации безопасности следующим образом

@Configuration
public class SecurityConfiguration extends WebSecurityConfigurerAdapter {

private final TokenAuthenticationFilter tokenAuthenticationFilter;

...

public SecurityConfiguration(TokenAuthenticationFilter tokenAuthenticationFilter) {
    this.corsFilter = corsFilter;
}

@Bean
public PasswordEncoder passwordEncoder() {
    return new BCryptPasswordEncoder();
}

@Override
public void configure(WebSecurity web) throws Exception {
    web.ignoring()
        .antMatchers(HttpMethod.OPTIONS, "/**");
}

@Override
protected void configure(HttpSecurity http) throws Exception {
    http
        .csrf().disable()
    .and()
        .addFilterBefore(tokenAuthenticationFilter, TokenAuthenticationFilter.class)
        .exceptionHandling()
        .authenticationEntryPoint(problemSupport)
        .accessDeniedHandler(problemSupport)
    .and()
        .logout()
        .logoutUrl("/api/logout")
        .logoutSuccessHandler(You log out success handler goes here)
        .permitAll()
    .and()
        .authorizeRequests()
        .antMatchers("/api/**").authenticated();

}

}

И ваш класс TokenAuthenticationFilter будет выполнять аутентификацию токена для каждого запроса.

@Configuration
public class SecurityConfiguration extends WebSecurityConfigurerAdapter {

private final TokenAuthenticationFilter tokenAuthenticationFilter;

...

public SecurityConfiguration(TokenAuthenticationFilter tokenAuthenticationFilter) {
    this.corsFilter = corsFilter;
}

@Bean
public PasswordEncoder passwordEncoder() {
    return new BCryptPasswordEncoder();
}

@Override
public void configure(WebSecurity web) throws Exception {
    web.ignoring()
        .antMatchers(HttpMethod.OPTIONS, "/**");
}

@Override
protected void configure(HttpSecurity http) throws Exception {
    http
        .csrf().disable()
    .and()
        .addFilterBefore(tokenAuthenticationFilter, TokenAuthenticationFilter.class)
        .exceptionHandling()
        .authenticationEntryPoint(problemSupport)
        .accessDeniedHandler(problemSupport)
    .and()
        .logout()
        .logoutUrl("/api/logout")
        .logoutSuccessHandler(You log out success handler goes here)
        .permitAll()
    .and()
        .authorizeRequests()
        .antMatchers("/api/**").authenticated();

   }
 }
...