Весенняя рабочая сессияРегистрация не работает с аутентификацией CAS - PullRequest
0 голосов
/ 21 апреля 2020

Я использую Spring Boot 2.1.6.RELEASE.

Мне нужно прервать сеанс пользователей, чьи ROLES изменились.

Я пытался использовать sessionRegistry, но это не помогло не работает, и я не могу понять, почему ...

Это мой класс SecurityConfigurer:

/**
 * Configuració de seguretat
 */
@Configuration
@EnableGlobalMethodSecurity(securedEnabled = true, prePostEnabled = true)
public class SecurityConfigurerAdapter extends WebSecurityConfigurerAdapter {

    public static final String WEB = "\\/((?!api).*)";
    public static final String API = "/api/**";

    @Order(1)
    @Configuration
    public static class RestApiWebSecurityConfigurerAdapter extends WebSecurityConfigurerAdapter {

        @Resource(name = "restAuthenticationFilter")
        private Filter restAuthenticationFilter;

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

            http
                .antMatcher(API)
                .csrf().disable()
                .antMatcher(API)
                .addFilterBefore(restAuthenticationFilter, CsrfFilter.class)
                .antMatcher(API)
                .authorizeRequests()
                .antMatchers(API).authenticated()
                .and()
                .antMatcher(API)
                .sessionManagement()
                .sessionCreationPolicy(SessionCreationPolicy.STATELESS)
            ;
        }
    }



    @Order(2)
    @Configuration
    public static class ApplicacionWebSecurityConfigurerAdapter extends WebSecurityConfigurerAdapter {

        private final CasProperties casProperties;

        private final AuthenticationUserDetailsService<CasAssertionAuthenticationToken> casUsuariDetailsService;

        private final UserDetailsService usuariDetailsService;

        @Bean
        public SessionRegistry sessionRegistry() {
            return new SessionRegistryImpl();
        }

        @Bean
        public ServletListenerRegistrationBean<HttpSessionEventPublisher> httpSessionEventPublisher() {
            return new ServletListenerRegistrationBean<HttpSessionEventPublisher>(new HttpSessionEventPublisher());
        }

        @Autowired
        public ApplicacionWebSecurityConfigurerAdapter(
            CasProperties casProperties,
            AuthenticationUserDetailsService<CasAssertionAuthenticationToken> casUsuariDetailsService,
            @Qualifier("casUserDetailsService")
                UserDetailsService usuariDetailsService) {
            this.casProperties = casProperties;
            this.casUsuariDetailsService = casUsuariDetailsService;
            this.usuariDetailsService = usuariDetailsService;
        }


        @Bean
        public ServiceProperties serviceProperties() throws UnknownHostException {

            ServiceProperties serviceProperties = new ServiceProperties();
            serviceProperties.setService(getUrlWithHostName(casProperties.getValidateUrl()));
            serviceProperties.setSendRenew(false);
            return serviceProperties;
        }

        @Bean
        public CasAuthenticationProvider casAuthenticationProvider() throws UnknownHostException {
            CasAuthenticationProvider casAuthenticationProvider = new CasAuthenticationProvider();
            casAuthenticationProvider
                .setAuthenticationUserDetailsService(casUsuariDetailsService);
            casAuthenticationProvider.setServiceProperties(serviceProperties());
            casAuthenticationProvider
                .setTicketValidator(cas20ServiceTicketValidator());
            casAuthenticationProvider.setKey("an_id_for_this_auth_provider_only");
            return casAuthenticationProvider;
        }


        @Bean
        public Cas20ServiceTicketValidator cas20ServiceTicketValidator() {
            return new Cas20ServiceTicketValidator(casProperties.getReturnUrl());
        }

        @Bean
        public CasAuthenticationFilter casAuthenticationFilter() throws Exception {
            CasAuthenticationFilter casAuthenticationFilter = new CasAuthenticationFilter();
            casAuthenticationFilter
                .setAuthenticationManager(authenticationManager());
            casAuthenticationFilter.setFilterProcessesUrl("/cas/login");
            casAuthenticationFilter.setSessionAuthenticationStrategy(sessionControlAuthenticationStrategy());
            return casAuthenticationFilter;
        }

        @Bean
        public CasAuthenticationEntryPoint casAuthenticationEntryPoint() throws UnknownHostException {
            CasAuthenticationEntryPoint casAuthenticationEntryPoint = new CasAuthenticationEntryPoint();
            casAuthenticationEntryPoint.setLoginUrl(casProperties.getLoginUrl());
            casAuthenticationEntryPoint.setServiceProperties(serviceProperties());
            return casAuthenticationEntryPoint;
        }

        @Bean
        public ConcurrentSessionControlAuthenticationStrategy sessionControlAuthenticationStrategy() {
            ConcurrentSessionControlAuthenticationStrategy csas = new ConcurrentSessionControlAuthenticationStrategy(sessionRegistry());
            csas.setMaximumSessions(1);
            csas.setExceptionIfMaximumExceeded(true);
            return csas;
        }
        /*
         * User impersonation
         */
        @Bean
        public SwitchUserFilter switchUserFilter() {
            SwitchUserFilter filter = new SwitchUserFilter();
            filter.setUserDetailsService(usuariDetailsService);
            filter.setSwitchUserUrl("/login/impersonate");
            filter.setExitUserUrl("/logout/impersonate");
            filter.setTargetUrl("/");
            filter.setUsernameParameter("username");
            filter.setSwitchFailureUrl("/");
            return filter;
        }

        @Override
        protected void configure(AuthenticationManagerBuilder auth)
            throws Exception {
            auth.authenticationProvider(casAuthenticationProvider());
        }
        @Bean
        public Filter ajaxTimeOutRedirectFilter() {
            AjaxTimeoutRedirectFilter f = new AjaxTimeoutRedirectFilter();
            f.setCustomSessionExpiredErrorCode(HttpStatus.UNAUTHORIZED.value());
            return f;
        }

        @Override
        protected void configure(HttpSecurity http) throws Exception {
            // Afegim el filtre del cas a les peticions
            http.addFilter(casAuthenticationFilter());

            http
                .regexMatcher(WEB)
                .exceptionHandling().authenticationEntryPoint(
                casAuthenticationEntryPoint())
                .and()
                .addFilterAfter(ajaxTimeOutRedirectFilter(), ExceptionTranslationFilter.class)
            ;

            http
                .regexMatcher(WEB)
                .csrf().csrfTokenRepository(CookieCsrfTokenRepository.withHttpOnlyFalse())

                .and()
                .regexMatcher(WEB)
                .authorizeRequests()
                .antMatchers("/images/**", "/css/**", "/fonts/**", "/js/**", "/bower_components/**").permitAll()
                .antMatchers("/logout").permitAll()
                .antMatchers("/cas/login").permitAll()
                .antMatchers("/login/impersonate").hasRole("ADMIN")
                // Actuator
                .antMatchers("/health").permitAll()
                .antMatchers("/info").permitAll()
                .antMatchers("/actuator").permitAll()
                // Swagger
                .antMatchers("/swagger-resources/**",
                    "/v2/api-docs", "/webjars/**", "/swagger-ui.html").permitAll()
                // Resta
                .regexMatchers(WEB).authenticated()
            ;


            http
                .regexMatcher(WEB)
                .logout().logoutUrl("/logout").deleteCookies("JSESSIONID")
                .logoutSuccessUrl(getUrlWithHostName(casProperties.getLogoutUrl()))
                .invalidateHttpSession(true);

            http
                .regexMatcher(WEB)
                .headers().frameOptions().sameOrigin();


        }

        private String getUrlWithHostName(String urlToFormat) throws UnknownHostException {

            return MessageFormat.format(urlToFormat, InetAddress
                .getLocalHost().getCanonicalHostName());
        }

    }

}

Я много пробовал, но кажется, что реестр всегда пуст , а руководители и сеансы всегда возвращают пустую карту ...

Есть предложения? Thks

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