下面是“详解Spring Boot 使用Spring security 集成CAS”的完整攻略。
1. 什么是CAS
CAS(Central Authentication Service)是企业级的单点登录解决方案,可以为多个客户端提供统一的认证和授权管理服务。它使用了流行的Web认证的协议,如OAuth、OpenID等,同时可以整合LDAP等现有认证机制。
2. Spring Boot 与 Spring Security 集成CAS
下面我们详细讲解如何使用Spring Boot和Spring Security集成CAS实现单点登录。
2.1 配置CAS服务器
首先,需要安装CAS服务器,可以参考官方文档: https://apereo.github.io/cas/。安装完成后,需要在cas.properties配置文件中配置一下参数:
cas.server.name=https://localhost:8443
cas.server.prefix=https://localhost:8443/cas
cas.ticket.registry.redis.pool.max-active=8
cas.ticket.registry.redis.pool.max-idle=8
cas.ticket.registry.redis.pool.min-idle=0
cas.ticket.registry.redis.pool.max-wait=3000
其中,"cas.server.name"和"cas.server.prefix"参数必须配置,用于指定CAS服务的名称和前缀。其它参数也可以根据自己的需要进行配置。
2.2 配置Spring Boot应用
接下来,需要在Spring Boot应用中配置CAS的相关参数。可以添加如下的依赖:
<dependency>
<groupId>org.jasig.cas.client</groupId>
<artifactId>cas-client-autoconfig-support</artifactId>
<version>3.6.0</version>
</dependency>
然后,可以在application.properties文件中配置CAS的参数,例如:
cas.server.url=https://localhost:8443/cas
cas.server.login.url=https://localhost:8443/cas/login
cas.server.logout.url=https://localhost:8443/cas/logout
cas.client.serviceUrl=https://localhost:8443/login/cas
这些参数也可以配置在application.yml文件中。
2.3 配置Spring Security
最后,我们需要配置Spring Security,将CAS集成到Security中。
首先,需要添加SPring Security以及CAS的依赖:
<dependency>
<groupId>org.springframework.security</groupId>
<artifactId>spring-security-cas</artifactId>
<version>5.2.0.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework.security</groupId>
<artifactId>spring-security-web</artifactId>
<version>5.2.0.RELEASE</version>
</dependency>
然后,需要在Security配置中指定CAS的验证器和登录成功后的跳转路径,例如:
@Configuration
@EnableWebSecurity
public class SecurityConfig extends WebSecurityConfigurerAdapter{
@Override
protected void configure(HttpSecurity http) throws Exception {
http.csrf().disable()
.authorizeRequests()
.antMatchers("/login", "/logout")
.permitAll()
.anyRequest()
.authenticated()
.and()
.exceptionHandling()
.authenticationEntryPoint(casAuthenticationEntryPoint())
.and()
.logout()
.logoutSuccessUrl("/")
.and()
.addFilter(casAuthenticationFilter());
}
@Bean
public CasAuthenticationEntryPoint casAuthenticationEntryPoint() {
CasAuthenticationEntryPoint entryPoint = new CasAuthenticationEntryPoint();
entryPoint.setLoginUrl(casServerUrl + "/login");
entryPoint.setServiceProperties(serviceProperties());
return entryPoint;
}
@Bean
public CasAuthenticationFilter casAuthenticationFilter() throws Exception {
CasAuthenticationFilter filter = new CasAuthenticationFilter();
filter.setAuthenticationManager(authenticationManager());
filter.setFilterProcessesUrl(casServiceUrl + "/j_spring_cas_security_check");
return filter;
}
@Bean
public ServiceProperties serviceProperties() {
ServiceProperties serviceProperties = new ServiceProperties();
serviceProperties.setService(casServiceUrl + "/j_spring_cas_security_check");
serviceProperties.setSendRenew(false);
return serviceProperties;
}
@Autowired
public void configureAuthentication(AuthenticationManagerBuilder auth) throws Exception {
auth.authenticationProvider(casAuthenticationProvider());
}
@Bean
public CasAuthenticationProvider casAuthenticationProvider() {
CasAuthenticationProvider provider = new CasAuthenticationProvider();
provider.setServiceProperties(serviceProperties());
provider.setTicketValidator(new Cas30ServiceTicketValidator(casServerUrl));
provider.setUserDetailsService(userDetailsService);
provider.setKey("casAuthProviderKey");
return provider;
}
}
其中,"casServerUrl"和"casServiceUrl"是CAS服务器的地址和Spring Boot应用的地址,"userDetailsService"是自定义的用户信息服务。
2.4 示例一:CAS实现前后端分离的单点登录
上述步骤主要实现了基于CAS的单点登录功能,接下来我们以一个示例来演示在前后端分离的Web应用中实现CAS的单点登录功能。
首先,我们创建一个前端Vue应用,它的访问地址为https://localhost:8080,后台Spring Boot应用的访问地址为https://localhost:8443,CAS服务器的访问地址为https://localhost:8443/cas。
在前端Vue应用中,我们可以使用vue-axios和vue-router把后台的请求和路由拦截器(interceptor)在一起。vue-axios将请求拦截器和响应拦截器集成进入了axios中,以便统一管理和处理请求。当用户访问前端应用的受限URL时,前端路由拦截器将把用户重定向到后台的CAS服务器,以完成登录验证。当用户的登录验证通过后,CORPSSIERVID将放到CAS返回的redirect地址里面。后端的拦截器在收到用户请求时,会利用cas-client-autoconfig-support提供的单点登录支持,验证用户是否已经在CAS中登录,如果已经登录,则直接放行,否则将用户重定向到CAS进行登录验证。
2.5 示例二:CAS实现分布式系统的单点登录
示例一演示了如何在前后端分离的Web应用中使用CAS实现单点登录,现在我们演示一下如何使用CAS实现分布式系统的单点登录。
首先,我们创建两个应用:应用一和应用二,它们都需要实现单点登录功能。与示例一不同的是,这里我们需要使用Redis内存,来维护分布式环境中的CAS TICKET,以增强安全性。
应用一的配置如下:
cas.server.name=https://localhost:8443/app-one
cas.server.prefix=https://localhost:8443/cas
cas.ticket.registry.redis.pool.max-active=8
cas.ticket.registry.redis.pool.max-idle=8
cas.ticket.registry.redis.pool.min-idle=0
cas.ticket.registry.redis.pool.max-wait=3000
应用二的配置如下:
cas.server.name=https://localhost:8443/app-two
cas.server.prefix=https://localhost:8443/cas
cas.ticket.registry.redis.pool.max-active=8
cas.ticket.registry.redis.pool.max-idle=8
cas.ticket.registry.redis.pool.min-idle=0
cas.ticket.registry.redis.pool.max-wait=3000
接下来,我们需要在两个应用的Spring Security中指定CAS的验证器和登录成功后的跳转路径,例如:
@Configuration
@EnableWebSecurity
public class SecurityConfig extends WebSecurityConfigurerAdapter{
@Override
protected void configure(HttpSecurity http) throws Exception {
http.csrf().disable()
.authorizeRequests()
.antMatchers("/login", "/logout")
.permitAll()
.anyRequest()
.authenticated()
.and()
.exceptionHandling()
.authenticationEntryPoint(casAuthenticationEntryPoint())
.and()
.logout()
.logoutSuccessUrl("/")
.and()
.addFilter(casAuthenticationFilter());
}
@Bean
public CasAuthenticationEntryPoint casAuthenticationEntryPoint() {
CasAuthenticationEntryPoint entryPoint = new CasAuthenticationEntryPoint();
entryPoint.setLoginUrl(casServerUrl + "/login");
entryPoint.setServiceProperties(serviceProperties());
return entryPoint;
}
@Bean
public CasAuthenticationFilter casAuthenticationFilter() throws Exception {
CasAuthenticationFilter filter = new CasAuthenticationFilter();
filter.setAuthenticationManager(authenticationManager());
filter.setFilterProcessesUrl(casServiceUrl + "/j_spring_cas_security_check");
return filter;
}
@Bean
public ServiceProperties serviceProperties() {
ServiceProperties serviceProperties = new ServiceProperties();
serviceProperties.setService(casServiceUrl + "/j_spring_cas_security_check");
serviceProperties.setSendRenew(false);
return serviceProperties;
}
@Autowired
public void configureAuthentication(AuthenticationManagerBuilder auth) throws Exception {
auth.authenticationProvider(casAuthenticationProvider());
}
@Bean
public CasAuthenticationProvider casAuthenticationProvider() {
CasAuthenticationProvider provider = new CasAuthenticationProvider();
provider.setServiceProperties(serviceProperties());
provider.setTicketValidator(new Cas30ServiceTicketValidator(casServerUrl));
provider.setUserDetailsService(userDetailsService);
provider.setKey("casAuthProviderKey");
return provider;
}
}
需要注意的是,在分布式系统中,我们需要使用RedisTicketRegistry类来代替DefaultTicketRegistry类,以使用Redis内存。
所以,以上是“详解Spring Boot 使用Spring security 集成CAS”的完整攻略,希望能对你有所帮助。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:详解Spring Boot 使用Spring security 集成CAS - Python技术站