Конец сеанса WebSocket также разрушает сеанс HTTP - PullRequest
0 голосов
/ 07 мая 2020

Реализовал приложение java на основе этого репозитория с открытым исходным кодом , добавил еще один тип аутентификации поверх него и заставил его работать с Spring-boot. Обновленный код можно найти здесь . Это приложение представляет собой пользовательский интерфейс для файлов пакетов ROS (операционная система Roboti c). Обычно файлы пакетов содержат данные датчиков, но иногда они также содержат массив изображений. Таким образом, в этом приложении пользователь может просматривать данные датчиков, изображения и воспроизводить видео, если в файле пакета хранится массив изображений.

В исходном репозитории была только одна система входа для администратора, чтобы разрешить некоторые привилегированные действия и домашняя страница была неограничена. Я добавил аутентификацию LDAP для доступа к домашней странице или любым другим данным, которые ранее не находились под администратором, за исключением таких ресурсов, как JS, CSS et c. Привилегированное действие все еще остается под аутентификацией администратора, вы можете проверить этот файл . Добавление небольших фрагментов из файла.

@Configuration
@Order(1)
class AdminSecurityConfig extends WebSecurityConfigurerAdapter {
    @Autowired
    private Environment myEnvironment;

    @Bean
    public UserService userService() {
        return new UserService();
    }

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

    @Bean
    public AuthenticationSuccessHandler authenticationSuccessHandler() {
        return new AjaxAuthenticationSuccessHandler("/");
    }

    @Override
    protected void configure(AuthenticationManagerBuilder auth) throws Exception {
        auth
                .eraseCredentials(true)
                .userDetailsService(userService())
                .passwordEncoder(passwordEncoder());
    }

    @Override
    protected void configure(HttpSecurity http) throws Exception {
        Set<String> profileSet = Sets.newHashSet(myEnvironment.getActiveProfiles());
        if (profileSet.contains("test")) {
            // CSRF protection is a pain to work around if we're doing unit tests;
            // disable it.
            http = http.csrf().disable();
        }

        http
                .sessionManagement().sessionCreationPolicy(SessionCreationPolicy.ALWAYS).and()
                .exceptionHandling().accessDeniedHandler(accessDeniedHandler()).and()
                .antMatcher("/signin").authorizeRequests()
                .and()
                .formLogin()
                .successHandler(authenticationSuccessHandler())
                .loginPage("/signin")
                .permitAll()
                .and()
                .logout()
                .logoutUrl("/logout")
                .permitAll()
                .logoutSuccessUrl("/signin?logout");
    }

@Configuration
@Order(2)
public class WebSecurityConfig extends WebSecurityConfigurerAdapter {

    @Bean
    public AuthenticationSuccessHandler authenticationSuccessHandler() {
        return new AjaxAuthenticationSuccessHandler("/");
    }

    private AccessDeniedHandler accessDeniedHandler() {
        return new CsrfAccessDeniedHandler() {
        };
    }

    @Override
    protected void configure(HttpSecurity http) throws Exception {
        http
                .sessionManagement().sessionCreationPolicy(SessionCreationPolicy.ALWAYS).and()
                .exceptionHandling().accessDeniedHandler(accessDeniedHandler()).and()
                .authorizeRequests()
                .antMatchers(
                        "/favicon.ico",
                        "/generalError",
                        "/resources/**",
                        "/signup").permitAll()
                .anyRequest().fullyAuthenticated()
                .and()
                .formLogin()
                .loginPage("/ldap_login")
                .successHandler(authenticationSuccessHandler())
                .permitAll()
                .and()
                .logout()
                .logoutUrl("/logout").permitAll()
                .logoutSuccessUrl("/ldap_login?logout");
    }

    @Override
    public void configure(AuthenticationManagerBuilder auth) throws Exception {
        auth
                .authenticationProvider(ldapAuthenticationProvider());
    }

Теперь проблема заключается в каждом воспроизведении видео (если в файле-паке есть массив изображений). Пользователь должен повторно аутентифицироваться через LDAP или логин администратора, они не могут выполнять какие-либо действия, требующие аутентификации, это похоже на то, что их сеанс каким-то образом разрушен. В файле журнала не печатается никаких исключений или ошибок, что затрудняет определение того, что происходит. После долгих поисков и размышлений я думаю, что, поскольку видео воспроизводится по протоколу WebSockets, как только сеанс WebSocket завершается, он также завершает сеанс пользователя HTTP. В этом проекте много файлов, поэтому я предоставил ссылки на репозиторий оригинал и мой репозиторий . Понятия не имею, как работает протокол WebSocket, было бы здорово, если бы кто-нибудь указал мне в правильном направлении, что здесь делать. Возможно ли, чтобы сеанс WebSocket мог завершить обычный сеанс пользователя? Если да, то как я могу его остановить или управлять обеими сессиями по отдельности?

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