CAS单点登录系统集成指南:从原理到Spring Boot与Vue实践
1. CAS简介与实现原理
1.1 开发方与背景
CAS(Central Authentication Service)是由耶鲁大学开发的企业级单点登录解决方案,现由Apereo基金会维护。作为开源项目,它已成为业界最流行的SSO实现之一。
1.2 核心原理
CAS基于Ticket机制实现SSO,主要流程如下:
sequenceDiagram
participant User
participant ClientApp
participant CAS Server
participant Service
User->>ClientApp: 访问受保护资源
ClientApp->>User: 重定向到CAS登录页
User->>CAS Server: 提交认证信息
CAS Server->>User: 颁发TGT(设置Cookie)和ST
User->>ClientApp: 携带ST访问
ClientApp->>CAS Server: 验证ST有效性
CAS Server->>ClientApp: 返回用户身份
ClientApp->>User: 授予访问权限
1.3 核心代码示例
CAS服务端配置示例(application.properties):
# CAS服务端配置
cas.server.name=https://cas.example.org
cas.server.prefix=${cas.server.name}/cas
# 认证处理器配置
cas.authn.accept.users=user::password
# Ticket配置
cas.ticket.tgt.rememberMe.enabled=true
cas.ticket.st.numberOfUses=1
cas.ticket.st.timeToKillInSeconds=30
2. Spring Boot集成CAS
2.1 添加依赖
<dependency>
<groupId>org.springframework.security</groupId>
<artifactId>spring-security-cas</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-security</artifactId>
</dependency>
2.2 安全配置
@Configuration
@EnableWebSecurity
public class CasSecurityConfig extends WebSecurityConfigurerAdapter {
@Value("${cas.server.url}")
private String casServerUrl;
@Value("${cas.service.url}")
private String serviceUrl;
@Override
protected void configure(HttpSecurity http) throws Exception {
http
.authorizeRequests()
.antMatchers("/", "/public/**").permitAll()
.anyRequest().authenticated()
.and()
.csrf().disable()
.logout().logoutSuccessUrl(casServerUrl + "/logout")
.and()
.exceptionHandling().authenticationEntryPoint(casAuthenticationEntryPoint())
.and()
.addFilter(casAuthenticationFilter())
.addFilterBefore(casLogoutFilter(), LogoutFilter.class)
.addFilterBefore(singleSignOutFilter(), CasAuthenticationFilter.class);
}
// 其他必要的Bean配置...
}
2.3 用户信息处理
@Service
public class CasUserDetailsService implements UserDetailsService {
@Override
public UserDetails loadUserByUsername(String username) {
// 从CAS返回的属性中获取用户信息
return new User(username, "",
AuthorityUtils.createAuthorityList("ROLE_USER"));
}
}
3. Vue集成CAS
3.1 Vue2集成方案
安装依赖
npm install vue-cas --save
全局配置
import Vue from 'vue';
import VueCas from 'vue-cas';
Vue.use(VueCas, {
casUrl: 'https://cas.example.org',
serviceUrl: 'http://your-frontend-app.com'
});
登录控制
// 在路由守卫中检查认证
router.beforeEach((to, from, next) => {
if (to.matched.some(record => record.meta.requiresAuth)) {
if (!Vue.prototype.$cas.isAuthenticated()) {
Vue.prototype.$cas.login();
} else {
next();
}
} else {
next();
}
});
3.2 Vue3集成方案
使用Composition API
import { createApp } from 'vue';
import { createCas } from 'vue-cas-next';
const cas = createCas({
casUrl: 'https://cas.example.org',
serviceUrl: 'http://your-vue3-app.com'
});
const app = createApp(App);
app.use(cas);
app.mount('#app');
自定义Hook
// useCas.ts
import { inject } from 'vue';
export default function useCas() {
const cas = inject('cas');
const login = () => {
cas.login();
};
const logout = () => {
cas.logout();
};
return { login, logout };
}
4. 常见问题与解决方案
- 跨域问题:确保CAS服务端配置了正确的CORS规则
- Session失效:合理设置Ticket过期时间
- 前后端分离架构:需要特殊处理REST API的认证
- 多系统集成:使用CAS的Service Registry管理多个服务
5. 总结
本文全面介绍了CAS单点登录系统的集成方案,从核心原理到具体实现,涵盖了Spring Boot后端和Vue前端的技术细节。通过合理的配置和代码实现,可以构建安全可靠的企业级单点登录系统。