Spring boot and Security: доступ к защищенному URL из приложения для Android. - PullRequest
0 голосов
/ 06 сентября 2018

Я разработал простую загрузку Spring и защиту Spring для входа в форму со следующей конфигурацией

@Configuration

@EnableWebSecurity

public class WebSecurityConfig extends WebSecurityConfigurerAdapter {
    @Autowired
    private UserDetailsService userDetailsService;

    @Bean
    public BCryptPasswordEncoder bCryptPasswordEncoder() {
        return new BCryptPasswordEncoder();
    }

    @Override
    protected void configure(HttpSecurity http) throws Exception {
        http
                .authorizeRequests()
                    .antMatchers("/resources/**", "/registration").permitAll()
                    .anyRequest().authenticated()
                    .and()
                .formLogin()
                    .loginPage("/login")
                    .permitAll()
                    .and()
                .logout()
                    .permitAll();

        http.csrf().disable();
    }

    @Autowired
    public void configureGlobal(AuthenticationManagerBuilder auth) throws Exception {
        auth.userDetailsService(userDetailsService).passwordEncoder(bCryptPasswordEncoder());
    }

Я также создал пользовательскую реализацию userDetailsService для получения пользователя.

Теперь, когда я вхожу с веб-страницы, используя форму входа, я могу успешно войти в систему и получить доступ к защищенным конечным точкам (я также вижу JSESSIONID в последующем ответе.

Но когда я пытаюсь войти через другой сервис (приложение для Android), используя httpPost с URL: http://localhost:9090/login,, я вижу, что пользователь аутентифицирован. Но тогда я не могу получить доступ к защищенным конечным точкам из приложения для Android. Ответ возвращает строку HTML (данные страницы входа).

Я также не вижу JSESSIONID в ответе.

В целом, моя конфигурация работает нормально для веб-страниц, но не может заставить ее работать с другими API.

1 Ответ

0 голосов
/ 06 сентября 2018

Работает, когда вы используете форму входа на веб-страницу, поскольку ваш пользовательский интерфейс и сервер находятся в одном домене. Когда Spring Security аутентифицирует пользователя, я полагаю, что он добавляет идентификатор сеанса в заголовок cookie, чтобы он мог аутентифицировать каждый запрос после входа в систему. При подключении к Spring API из другого домена, в данном случае вашего Android-приложения, оно больше не находится в том же домене, поэтому Spring Security не добавит идентификатор сеанса в заголовок файла cookie. Поэтому, чтобы сделать то, что вы хотите, я считаю, что вам нужно написать собственный фильтр аутентификации, чтобы добавить cookie или заголовок к запросу. Вот ссылка, которая использует JSON Web Tokens для аутентификации API с использованием Spring Boot. https://auth0.com/blog/implementing-jwt-authentication-on-spring-boot/

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...