Spring Security и CAS. Анонимный пользователь после успешной аутентификации - PullRequest
0 голосов
/ 09 января 2019

Я пытаюсь настроить Spring Security для работы с CAS. Я нахожусь на этапе, когда я получил успешную аутентификацию, CAS дает билет для моего заявления. Но после успешной аутентификации в CAS мне нужно взять имя пользователя и отправить запрос в другую систему, но я не знаю как, потому что здесь

SecurityContext ctx=SecurityContextHolder.getContext();
Authentication authentication = ctx.getAuthentication();

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

В каком месте после аутентификации я могу найти имя пользователя и отправить запрос в другую систему?
Я делаю клиент CAS в соответствии с этим учебным пособием .

Отредактировано: Я добавляю свой код cobfiguration, должно быть проще:

@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;

}

@Bean
public UserDetailsService userDetailsService(){
    return new CCDUserDetailsService();
}

@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;
}

@Override
protected void configure(HttpSecurity http) throws Exception {
    http
            .csrf().disable()
            .authorizeRequests()
            .regexMatchers("/secured", "/login")
            .authenticated()
            .and()
            .httpBasic()
            .authenticationEntryPoint(authenticationEntryPoint)
            .and()
            .logout().logoutSuccessUrl("/logout")
            .and()
            .addFilterBefore(singleSignOutFilter, CasAuthenticationFilter.class)
            .addFilterBefore(logoutFilter, LogoutFilter.class);
}

}

И здесь у меня есть конфигурация для CAS Provider.

@Configuration
public class AuthenticationApp {

@Value("${serviceProperties.protocol}")
String serviceProperiesProtocol;

@Value("${serviceProperties.host}")
String serviceProperiesHost;

@Value("${serviceProperties.port}")
String serviceProperiesPort;

@Value("${entryPoint.protocol}")
String entryPointProtocol;

@Value("${entryPoint.host}")
String entryPointHost;

@Value("${entryPoint.port}")
String entryPointPort;

@Autowired
CCDUserDetailsService userDetailsService;

@Bean
public ServiceProperties serviceProperties() {
    ServiceProperties serviceProperties = new ServiceProperties();
    serviceProperties.setService("https://localhost:8080");
    serviceProperties.setSendRenew(false);
    return serviceProperties;
}

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

    CasAuthenticationEntryPoint entryPoint
            = new CasAuthenticationEntryPoint();
    entryPoint.setLoginUrl(entryPointProtocol + "://" +
            entryPointHost + ":" + entryPointPort + "/cas/login");
    entryPoint.setServiceProperties(sP);
    return entryPoint;
}

@Bean
public TicketValidator ticketValidator() {
    return new Cas30ServiceTicketValidator(
            entryPointProtocol + "://" +
                    entryPointHost + ":" + entryPointPort + "/cas");
}

@Bean
public CasAuthenticationProvider casAuthenticationProvider() {

    CasAuthenticationProvider provider = new CasAuthenticationProvider();
    provider.setServiceProperties(serviceProperties());
    provider.setTicketValidator(ticketValidator());
    provider.setUserDetailsService(userDetailsService);
    provider.setKey("CAS_PROVIDER_LOCALHOST_9000");
    return provider;
}

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

@Bean
public LogoutFilter logoutFilter() {
    LogoutFilter logoutFilter = new LogoutFilter(
            entryPointProtocol + "://" +
                    entryPointHost + ":" + entryPointPort + "/cas/logout",
            securityContextLogoutHandler());
    logoutFilter.setFilterProcessesUrl("/logout/cas");
    return logoutFilter;
}

@Bean
public SingleSignOutFilter singleSignOutFilter() {
    SingleSignOutFilter singleSignOutFilter = new SingleSignOutFilter();
    singleSignOutFilter.setCasServerUrlPrefix(entryPointProtocol + "://" +
            entryPointHost + ":" + entryPointPort + "/cas");
    singleSignOutFilter.setIgnoreInitConfiguration(true);
    return singleSignOutFilter;
}

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

}

CAS console log

URL after login

Я хочу также подтвердить, что если у меня возникла ситуация, подобная приведенной выше, у меня будет успешная полная аутентификация со стороны CAS.

Но где я могу найти информацию о логине пользователя или об этом отмечен в URL?

1 Ответ

0 голосов
/ 09 января 2019

Если вы следовали этому руководству, есть ли у вас случайно это в вашей конфигурации?

protected void configure(HttpSecurity http) throws Exception {
  http.authorizeRequests()
    .antMatchers("/**")
    .permitAll();
}

В частности, оператор permitAll, который отключил бы весь механизм аутентификации в вашем коде. Вы, вероятно, хотите иметь fullyAuthenticated вместо

protected void configure(HttpSecurity http) throws Exception {
  http.authorizeRequests()
    .antMatchers("/**")
    .fullyAuthenticated();
}

Появляются две вещи:

Не стоит делать CasAuthenticationFilter компонентом и вставьте его вручную в нужную вам позицию.

Затем убедитесь, что после того, как ваш фильтр был вызван, фильтр или менеджер аутентификации вызвали

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