1、cas项目下载
Cas项目可以在GitHub上下载,地址:https://github.com/apereo/cas/releases
本文以cas V4.0.0为例,解压后得到的是cas server的源码,需要把目录下的cas-server-webapp项目加载到idea中。
2、配置cas项目的数据库连接和去掉https请求
配置cas-server
修改%tomcat_home%/webapps/cas/WEB_INF/deployerConfigContext.xml
配置数据库验证bean
修改authenticationManager
添加一个entry,primaryAuthenticationHandler。
创建自定义密码校验处理类
创建一个自定义的密码校验类MyAuthenticationHandler,继承AbstractJdbcUsernamePasswordAuthenticationHandler,
进行密码校验。
@Override
protected HandlerResult authenticateUsernamePasswordInternal(UsernamePasswordCredential usernamePasswordCredential) throws GeneralSecurityException, PreventedException {
final String username = usernamePasswordCredential.getUsername();
final String password = usernamePasswordCredential.getPassword();
try {
final Map values = getJdbcTemplate().queryForMap(this.sql, username);
String dbPassword = (String) values.get("password");
String salt = (String) values.get("salt");
salt=username+salt;
Integer status = (Integer) values.get("status");
if(!status.equals(1)) { //判断帐号是否被冻结
throw new AccountLockedException("This user is disabled.");
}
//密码加盐并迭代1024次
String encryptedPassword = new Md5Hash(usernamePasswordCredential.getPassword(), salt, 2).toHex();
if (!dbPassword.equals(encryptedPassword)) {
throw new FailedLoginException("Password does not match value on record.");
}
} catch (final IncorrectResultSizeDataAccessException e) {
if (e.getActualSize() == 0) {
throw new AccountNotFoundException(username + " not found with SQL query");
} else {
throw new FailedLoginException("Multiple records found for " + username);
}
} catch (final DataAccessException e) {
e.printStackTrace();
throw new PreventedException("SQL exception while executing query for " + username, e);
}
return createHandlerResult(usernamePasswordCredential, new SimplePrincipal(username), null);
}
去掉https验证
cas默认是采用https模式的,我们没有配置证书,所以去掉https验证取消https的过滤,让http协议也能访问
4.0.0 版本一共需要修改三个地方
修改deployerConfigContext.xml添加p:requireSecure=”false”
cas/WEB-INF/deployerConfigContext.xml
修改ticketGrantingTicketCookieGenerator.xml修改p:cookieSecure=”false”
cas/WEB-INF/spring-configuration/ticketGrantingTicketCookieGenerator.xml
修改warnCookieGenerator.xml修改p:cookieSecure=”false”
cas/WEB-INF/spring-configuration/warnCookieGenerator.xml
3、spring security 和cas的集成
修改spring-sercurity.xml
1、配置一个cas地址的properties文件。
#cas server login address
cas_server_login=http://localhost:8084/cas/login
#cas server login successful return localhost address
localhost_server=http://localhost:8080/nsycManager/j_spring_cas_security_check
#cas server ticket validator address
cas_server_address=http://localhost:8084/cas
#cas server logout successful return localhost address
cas_server_logout=http://localhost:8084/cas/logout?service=http://localhost:8080/nsycManager/login
2、设置spring sercurity的自动拦截设置为false,配置一个进入cas的认证入口casAuthEntryPoint。在拦截器里配置一个自定义的cas认证过滤器、一个注销客户端和一个注销session的服务器端的过滤器。
认证入口里配置一个cas的登录地址,和一个认证成功后当前项目的返回地址。
3、配置cas认证过滤器
配置一个拦截登录请求的URL地址、配置一个cas认证提供器、配置认证过滤器成功跳转方法和失败跳转方法。其中cas认证提供器里配置有cas的ticket的校验类casTicketValidator、ticket认证成功后返回的当前项目的地址、校验方式和UserDetailsService的实现类。
4、注销客户端过滤器
5、注销服务器端过滤器
注销服务器端的过滤器中,配置一个服务器的注销地址和当前项目退出操作的URL地址。
注意:服务器的注销地址中可以带一个注销成功后的回调地址。
cas_server_logout=http://localhost:8084/cas/logout?service=http://localhost:8080/nsycManager/login
需要配置cas项目
WEB-INF/cas.properties文件 改成true
##
# CAS Logout Behavior
# WEB-INF/cas-servlet.xml
#
# Specify whether CAS should redirect to the specified service parameter on /logout requests
cas.logout.followServiceRedirects=true
注意:cas要和spring security集成,还需要添加spring-security-cas和cas-client-core这两个架包。
到此,spring sercurity和cas实现SSO单点登录完成。