2015-07-22 3 views
0

J'utilise Spring Security avec Spring Boot et authentifie mes utilisateurs via JASIG CAS. Certaines pages nécessitent une authentification explicite (.authenticated()) et certaines d'entre elles concernent tous les utilisateurs.Déterminer l'utilisateur CAS automatiquement sur public (permitAll()) page

Maintenant, il y a une certaine zone dans le menu, qui indique l'utilisateur actuel et les actions possibles, comme la connexion/déconnexion. Mon principal problème est maintenant que la page principale est public (permisAll()) et que, si un utilisateur a déjà une session CAS à travers une autre application, il est affiché comme "utilisateur anonyme" jusqu'à ce que l'utilisateur clique sur la page protégée est ouverte.

Y a-t-il quelqu'un qui a des idées sur la façon de fonctionner?

Ma configuration de sécurité:

import org.jasig.cas.client.validation.Cas20ServiceTicketValidator; 
import org.springframework.beans.factory.annotation.Autowired; 
import org.springframework.context.annotation.Bean; 
import org.springframework.context.annotation.Configuration; 
import org.springframework.core.env.Environment; 
import org.springframework.security.cas.ServiceProperties; 
import org.springframework.security.cas.authentication.CasAuthenticationProvider; 
import org.springframework.security.cas.web.CasAuthenticationEntryPoint; 
import org.springframework.security.cas.web.CasAuthenticationFilter; 
import org.springframework.security.config.annotation.authentication.builders.AuthenticationManagerBuilder; 
import org.springframework.security.config.annotation.method.configuration.EnableGlobalMethodSecurity; 
import org.springframework.security.config.annotation.method.configuration.GlobalMethodSecurityConfiguration; 
import org.springframework.security.config.annotation.web.builders.HttpSecurity; 
import org.springframework.security.config.annotation.web.builders.WebSecurity; 
import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity; 
import org.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter; 
import org.springframework.security.core.userdetails.AuthenticationUserDetailsService; 
import org.springframework.security.web.authentication.SavedRequestAwareAuthenticationSuccessHandler; 

@Configuration 
@EnableWebSecurity 
public class SecurityConfiguration extends WebSecurityConfigurerAdapter { 

@Autowired 
private Environment env; 

@Autowired 
private CasAuthenticationProvider authProvider; 

@Bean 
public ServiceProperties serviceProperties() { 
    ServiceProperties sp = new ServiceProperties(); 
    sp.setSendRenew(false); 
    sp.setService(env.getProperty("app.url") + "/j_spring_cas_security_check"); 
    return sp; 
} 

@SuppressWarnings("rawtypes") 
@Autowired 
private AuthenticationUserDetailsService customUserDetailsService() { 
    return new CASUserDetailsService(); 
} 


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

@Bean 
public Cas20ServiceTicketValidator cas20ServiceTicketValidator() { 
    return new Cas20ServiceTicketValidator(env.getProperty("cas.service.url")); 
} 

@Bean 
public CasAuthenticationFilter casAuthenticationFilter() throws Exception { 
    CasAuthenticationFilter casAuthenticationFilter = new CasAuthenticationFilter(); 
    casAuthenticationFilter.setAuthenticationManager(authenticationManager()); 
    casAuthenticationFilter.setAuthenticationSuccessHandler(savedRequestAwareAuthenticationSuccessHandler()); 
    return casAuthenticationFilter; 
} 

@Bean 
public CasAuthenticationEntryPoint casAuthenticationEntryPoint() { 
    CasAuthenticationEntryPoint ep = new CasAuthenticationEntryPoint(); 
    ep.setLoginUrl(env.getProperty("cas.service.url") + "/login"); 
    ep.setServiceProperties(serviceProperties()); 
    return ep; 
} 

@Autowired 
public void configureGlobal(AuthenticationManagerBuilder auth) throws Exception { 
    auth.authenticationProvider(authProvider); 
} 

@Override 
public void configure(WebSecurity web) throws Exception { 
    web.ignoring().antMatchers("/js/**").antMatchers("/fonts/**").antMatchers("/images/**").antMatchers("/css/**"); 
} 

@Override 
protected void configure(HttpSecurity http) throws Exception { 
    http.exceptionHandling(). 
      authenticationEntryPoint(casAuthenticationEntryPoint()).and().addFilter(casAuthenticationFilter()). 
      logout().logoutUrl("/caslogout").addLogoutHandler(logoutHandler()).logoutSuccessUrl("/").deleteCookies("JSESSIONID").permitAll().and(). 
      csrf().disable().headers().frameOptions().disable().authorizeRequests().antMatchers("/rest/**").permitAll(). 
      antMatchers("/login/**").authenticated().antMatchers("/settings/**").authenticated(). 
      antMatchers("/projects/*/settings").authenticated().antMatchers("/projects/*/role").authenticated(). 
      antMatchers("/projects/*/*/admin").authenticated().antMatchers("/**").permitAll(); 
} 


@Bean 
public SavedRequestAwareAuthenticationSuccessHandler savedRequestAwareAuthenticationSuccessHandler() { 
    CASAuthSuccessHandler auth = new CASAuthSuccessHandler(); 
    return auth; 
} 

@Bean 
public CASLogoutHandler logoutHandler() { 
    CASLogoutHandler logout = new CASLogoutHandler(); 
    return logout; 
} 


@EnableGlobalMethodSecurity(prePostEnabled = true, jsr250Enabled = true) 
private static class GlobalSecurityConfiguration extends GlobalMethodSecurityConfiguration { 
} 

}

Répondre

0

Ce que vous cherchez est la fonction passerelle de CAS. Actuellement, ce n'est pas pris en charge dans Spring Security. Il y a un JIRA enregistré pour le supporter et un Pull Request qui attend des modifications supplémentaires en fonction de mes commentaires à l'émetteur.

Je jetterai un coup d'oeil à la demande Pull car il montre quelques options sur la façon de mettre en œuvre cela. Veuillez lire tout le manuel, car vous devrez apporter des modifications à la demande de tirage afin de garantir le bon fonctionnement de votre application.