Как защитить приложение MVC с помощью OAuth2 с помощью Spring? - PullRequest
0 голосов
/ 30 мая 2018

Извините, мой английский.

У меня есть приложение, в которое я могу войти обычным способом.

@Configuration
@EnableWebSecurity
public class LoginSecurityConfig extends WebSecurityConfigurerAdapter {

    @Override
    protected void configure(AuthenticationManagerBuilder auth) throws Exception {
        System.out.println("LoginSecurityConfig :: configure");

        auth.jdbcAuthentication().dataSource( getDataSource() )
            .passwordEncoder( new BCryptPasswordEncoder(16) )
            .usersByUsernameQuery(
                "select user_name as username,password,enabled from users where user_name=?")
            .authoritiesByUsernameQuery(
                "select user_name as username, role_name from users_roles ur join users u on ur.user_id = u.user_id and u.user_name = ?");

    }

    @Override
    protected void configure(HttpSecurity http) throws Exception {


        http
        .csrf().disable()
        .authorizeRequests()
        .antMatchers("/login*").anonymous()
        .antMatchers("/resources/**").permitAll()
        .antMatchers("/fotos/**").permitAll()
        .antMatchers("/users").access("hasRole('ROLE_ADMIN')")
        .antMatchers("/user").access("hasRole('ROLE_ADMIN')")
        .anyRequest().authenticated()
        .and()

        .formLogin()
        .loginPage("/loginPage")
        .defaultSuccessUrl("/home", true)
        .failureUrl("/loginPage?error=true")
        .loginProcessingUrl("/login")
        .usernameParameter("username")
        .passwordParameter("password")
        .and()

        .logout()
        .logoutSuccessUrl("/loginPage")
        .invalidateHttpSession(true); 



    }    

}

Используя это, я могу попытаться получить доступ к любому защищенному ресурсу, и система отправляет меня на loginPage, где я могуотправьте username и password на внутренний контроллер login, тогда у меня есть Principal и я могу получить доступ к защищенным ресурсам (дома, пользователям, пользователю).Работает нормально.

Но ... Мне нужно удалить базу данных пользовательского элемента управления и использовать OAuth2, чтобы разрешить такой же доступ.Я больше не хочу, чтобы в моей базе данных были пользователи.Мне нужен экран входа в систему, а затем запрос токена, такой как http://myserver/oauth/token?grant_type=password&username=admin&password=admin, передающий client_id и client_secret в Basic.Я знаю, как выполнить часть «get token», и мой сервер работает нормально и дает мне токен и обновляет токен, но использует только Postman, потому что я не знаю, как использовать его в коде моего веб-приложения.Все учебники, которые я нашел, используют и Сервер, и Клиент в одном приложении и фактически не показывают, как использовать удаленный сервер OAuth2.

Уже попробуйте использовать this .Это отличный учебник, очень близкий к тому, что мне нужно, но слишком сложный для меня.

У меня есть этот код, и я понимаю, что он может использовать сервер и выдавать токен с использованием учетных данных клиента, но не знаю, какпредоставить пользователю экран входа в систему и принять его учетные данные для выполнения запроса (часть GET).

@Configuration
@EnableResourceServer
public class OAuth2ResourceServerConfigRemoteTokenService extends ResourceServerConfigurerAdapter {

    @Override
    public void configure(final HttpSecurity http) throws Exception {
                http.sessionManagement().sessionCreationPolicy(SessionCreationPolicy.IF_REQUIRED)
                    .and()
                    .authorizeRequests().anyRequest().permitAll();              
    }

    @Primary
    @Bean
    public RemoteTokenServices tokenServices() {
        final RemoteTokenServices tokenService = new RemoteTokenServices();
        tokenService.setCheckTokenEndpointUrl("http://myoauthserver/oauth/check_token");
        tokenService.setClientId("clientid");
        tokenService.setClientSecret("password");
        return tokenService;
    }

}

, так что ... как я могу защитить свою систему, взять логин и пароль отПользователь и использовать этот код для управления учетными данными, как я использовал обычный метод базы данных?

Или OAuth2 только для безопасного REST API?

enter image description here

Пожалуйста, будьте дружелюбны с новичками, потому что мне не очень удобно использовать Spring.

Ответы [ 2 ]

0 голосов
/ 03 июня 2018

Просто как 1,2,3 ...

Просто немного измените мой сервер OAuth2, чтобы он принимал метод oauth/authorize.

@Override
protected void configure(HttpSecurity http) throws Exception {

    http
        .requestMatchers()
        .antMatchers("/login", "/oauth/authorize")
    .and()
        .authorizeRequests()
        .anyRequest()
        .authenticated()
    .and()
        .formLogin()
        .permitAll();       
}

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

Здесь вы можете найти образец клиента и более подробную информацию: http://www.baeldung.com/sso-spring-security-oauth2

Также вы можете проверить весь мой сервер и клиент на моемgithub репо:

https://github.com/icemagno/geoinfra/cerberus

и

https://github.com/icemagno/geoinfra/atlas

Он находится в pt_BR

0 голосов
/ 02 июня 2018

Недавно я сам работал над этим и хотел бы сказать, что у меня есть простой ответ, но я этого не делаю.Я должен начать с того, чтобы задавать вопросы, например, является ли это веб-приложение (JSP и т. Д.) Или REST API, используемым веб-приложением, или REST API, используемое мобильным приложением и т. Д. И т. Д.

Причинаважно, чтобы вы сначала выбрали один из профилей OAuth2 и типы предоставления, и все они имеют разные требования и конфигурацию в Spring.

Кроме того, вы пытаетесь интегрироваться со сторонним поставщиком аутентификации OAuth2(например, Facebook) или ваше приложение действует как поставщик аутентификации (где происходит проверка логина и пароля) и как защищенный ресурс (куда направляются запросы веб-страницы или вызовы API)?

Так что я думаю, что лучшее, что я могу сделать, - это назначить вам домашнее задание:

(1) Прочитать о различных профилях OAuth2 и определить, какой из них лучше всего подходит для вашего приложения, и изучить всю терминологию (например, в чем секрет клиента?).

Это определенно НЕ тот случай, когда вы можете просто вырезать и вставить пример кода, не понимая его.Если у вас нет разумного понимания того, как работает OAuth2, у вас будут большие трудности.

Также: мы говорим о БЕЗОПАСНОСТИ, поэтому делать вещи без понимания, что это очень плохая идея.Если вы неосторожны, вы можете подумать, что это работает, но на самом деле вы широко открыты для атак.

(2) если вы не знакомы с Spring Framework Security, вам понадобятся базовые знания, чтобы понять, что вы делаете.

(3) Как только у вас появится идея,профиль, который вы будете использовать, используйте его в поиске Google, например, «Неявное предоставление Spring oauth2», чтобы найти пример, адаптированный для этого профиля.

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

Справочное руководство Spring также полезно, но не обязательно содержит все детали для всех проблем, с которыми вы можете столкнуться.Наконец, попытайтесь реализовать это в своем приложении.

Вам понадобятся хорошие инструменты для отправки запросов в ваше приложение (для этого мне нравится PostMan), чтобы вы могли просматривать данные, передаваемые туда и обратно.OAuth2 включает в себя сложную серию перенаправлений HTTP, поэтому тестирование может быть немного сложным.

Кроме того, наберитесь терпения.Я считаю себя экспертом Spring, и мне все еще потребовалось несколько дней, чтобы все работало так, как я хотел.Обратите внимание, что на самом деле есть ОЧЕНЬ МАЛЕНЬКИЙ код, который вы в конечном итоге пишете, но трудно точно получить небольшое количество кода.

...