Аутентификация в Spring Boot Security вызывает цикл перенаправления на сервере Glassfish. - PullRequest
0 голосов
/ 16 мая 2019

Я разрабатываю приложение Spring boot (2.0.5), используя

  • spring-boot-starter-security (2.0.5)
  • spring-security-cas (5.0.8).

Приложение было разработано с использованием tomcat , и все работало как надо, но когда мы разворачиваем приложение на payara glassfish 5.0 , мы получаем ошибку цикла перенаправления.

Что происходит, когда кто-то подключается к моему приложению, он не авторизован и перенаправляется на сервер, когда он возвращается, мое приложение распознает, что пользователь прошел проверку подлинности, и пропускает его в безопасную часть приложения. (вот как это работает на tomcat )

Но на glassfish мое приложение не распознает, что пользователь был успешно аутентифицирован, поэтому оно перенаправляет его обратно на сервер.

Spring Spring настроен для Java, код приведен ниже, некоторые части скрыты для сохранения конфиденциальности.

@Override
        protected SpringApplicationBuilder configure(SpringApplicationBuilder application) {
            return application.sources(applicationClass);
        }

        private static Class<UserPortalApplication> applicationClass = UserPortalApplication.class;

    @Bean
    public ServiceProperties serviceProperties() {
        ServiceProperties serviceProperties = new ServiceProperties();
        serviceProperties.setService("https://some-url/login/cas");
        serviceProperties.setSendRenew(false);
        return serviceProperties;
    }

    @Bean
    @Primary
    public AuthenticationEntryPoint authenticationEntryPoint(
      ServiceProperties sP) {

        CasAuthenticationEntryPoint entryPoint
          = new CasAuthenticationEntryPoint();
        entryPoint.setLoginUrl("https://some-url/cas/login");
        entryPoint.setServiceProperties(sP);
        return entryPoint;
    }

    @Bean
    public TicketValidator ticketValidator() {
        return new Cas20ServiceTicketValidator(
          "https://some-url/cas");
    }

    @Bean
    public CasAuthenticationProvider casAuthenticationProvider() {
      CasAuthenticationProvider provider = new CasAuthenticationProvider();
      provider.setServiceProperties(serviceProperties());
      provider.setTicketValidator(ticketValidator());
          provider.setAuthenticationUserDetailsService(new CasUserDetailService());
      provider.setKey("CAS_PROVIDER_LOCALHOST_9000");
      return provider;
    }

    @Bean
    public SecurityContextLogoutHandler securityContextLogoutHandler() {
      return new SecurityContextLogoutHandler();
    }

    @Bean
    public LogoutFilter logoutFilter() {
      LogoutFilter logoutFilter = new LogoutFilter(
        "https://some-url/cas/logout", securityContextLogoutHandler());
      logoutFilter.setFilterProcessesUrl("/logout/cas");
      return logoutFilter;
    }

    @Bean
    public SingleSignOutFilter singleSignOutFilter() {
      SingleSignOutFilter singleSignOutFilter = new SingleSignOutFilter();
      singleSignOutFilter.setCasServerUrlPrefix("https://some-url/cas");
      singleSignOutFilter.setIgnoreInitConfiguration(true);
      return singleSignOutFilter;
    }

    @EventListener
    public SingleSignOutHttpSessionListener singleSignOutHttpSessionListener(HttpSessionEvent event) {
      return new SingleSignOutHttpSessionListener();
    }

SecurityConfig

    @EnableWebSecurity
@Configuration
public class SecurityConfig extends WebSecurityConfigurerAdapter {

    private AuthenticationProvider authenticationProvider;
    private AuthenticationEntryPoint authenticationEntryPoint;
    private SingleSignOutFilter singleSignOutFilter;
    private LogoutFilter logoutFilter;

    @Autowired
    public SecurityConfig(CasAuthenticationProvider casAuthenticationProvider, AuthenticationEntryPoint eP,
                          LogoutFilter lF
                          , SingleSignOutFilter ssF
    ) {
        this.authenticationProvider = casAuthenticationProvider;
        this.authenticationEntryPoint = eP;

        this.logoutFilter = lF;
        this.singleSignOutFilter = ssF;

    }

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

        http
        .csrf().disable().cors().disable()
        //.requiresChannel().anyRequest().requiresSecure()
        //.and()
        .authorizeRequests()
        .antMatchers("/login.*")
        .permitAll()
        .and()
        .authorizeRequests() 
        .regexMatchers("/secured.*", "/login")
        .authenticated()
        .and()
        .authorizeRequests() 
        .regexMatchers("/controllers.*", "/login")
        .authenticated()
        .and()
        .authorizeRequests()
        .regexMatchers("/")
        .permitAll()
        .and()
        .httpBasic()
        .authenticationEntryPoint(authenticationEntryPoint)
        .and()
        .logout().logoutSuccessUrl("/logout")
        .and()
        .addFilterBefore(singleSignOutFilter, CasAuthenticationFilter.class)
        .addFilterBefore(logoutFilter, LogoutFilter.class);
    }

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

    @Override
    protected AuthenticationManager authenticationManager() throws Exception {
      return new ProviderManager(Arrays.asList(authenticationProvider));
    }

    @Bean
    public CasAuthenticationFilter casAuthenticationFilter(ServiceProperties sP) throws Exception {
      CasAuthenticationFilter filter = new CasAuthenticationFilter();
      filter.setServiceProperties(sP);
      filter.setAuthenticationManager(authenticationManager());
      return filter;
    }


}  

...