Я пытаюсь настроить 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.
Но где я могу найти информацию о логине пользователя или об этом отмечен в URL?