SSO之CAS
为什么要使用CAS
当多个系统之间存在联系时,此时问题来了,是需要单个单个认证呢?还是只需要认证其中一个即可访问其他的呢?当然会选择后者,这样才是人的本性,懒惰是技术进步的前提嘛。此时会有疑问信任信息如何产生?如何存储信任信息?对于产生信任信息不难,后台服务器如直接生成随机数,而存储信任信息解决方案:cookie、jsonp、页面重定向等。
CAS是什么
先说一下单点登录SSO(Single Sign On)即多个系统只需登录一次,无需重复登录即可访问对方,而CAS只是其解决方案,CAS大概流程原理如:
参考需要注意是与单一登录(同一系统,同一用户在同一时间内只能有一个会话(即一个用户只有一个在使用的浏览器))区别。
如何使用CAS
经过上述一番不详解说,大概知道需要CAS服务器与CAS客户端,而对于这一切冥冥之中已经被Apereo和Spring所安排好,我们只需要拿来使用即可,创造的事是上帝的事,我们只是“程序猿”。
搭建CAS服务器:(以CAS5.x为例)
(1)https://github.com/apereox选择cas-overlay-template下载(便于扩展)
(2)若使用https则需要生成ssl证书:
keytool使用:https://www.jianshu.com/p/7d223cf827c8 1)生成证书 keytool -genkey -v -alias 别名 -validity 3650 -keyalg RSA -keypass 密码 -storepass 密码 -keystore 文件名
2)导出证书 keytool -export -alias 别名 -keystore 文件名 -file 文件名.cer -storepass 密码
3)客户端配置:为客户端的JVM导入密钥(将服务器下发的证书导入到JVM中) keytool -import -trustcacerts -alias 别名 -keystore "$JAVA_HOME/jre/lib/security/cacerts" -file 文件名.cer -storepass changeit 注意:导入JVM 密码默认的是changeit,其他密码会报keytool 错误: java.io.IOException: Keystore was tampered with, or password was incorrect 若不配,则访问时报sun.security.provider.certpath.SunCertPathBuilderException: unable to find valid certification path to requested target sun.security.validator.ValidatorException: PKIX path building failed: sun.security.provider.certpath.SunCertPathBuilderException: unable to find valid certification path to requested target
4)配置服务器 SSL tomcat修改server.xml中的SSL服务 Window : <Connector port="8443" maxHttpHeaderSize="8192" maxThreads="150" minSpareThreads="25" maxSpareThreads="75" enableLookups="false" disableUploadTimeout="true" acceptCount="100" scheme="https" secure="true" clientAuth="false" sslProtocol="TLS" keystoreFile="d:/my.keystore" keystorePass="changeit"/>
Linux: <Connector port="8443" maxHttpHeaderSize="8192" maxThreads="150" minSpareThreads="25" maxSpareThreads="75" enableLookups="false" disableUploadTimeout="true" acceptCount="100" scheme="https" secure="true" clientAuth="false" sslProtocol="TLS" keystoreFile="~/my.keystore" keystorePass="changeit"/>
Springboot:application.yml(最好yml,而不要properties)
server:
context-path: /cas
port: 9000
ssl:
#enabled: false 是否启用ssl默认true,当为false时,即http
key-store: "classpath:bugbiu.jks"
key-store-password: bugbiu
key-password: bugbiu
#key-alias: cas #目前支持3中方式:1、CAS;2、CAS3;3、SAML
## # CAS Authentication Credentials #
cas:
authn:
accept:
users: "admin::admin"
(3)cas-overlay-template-5.x下 build run (最好不要使用build bootrun,具体build help看一下)
CAS客户端:(以Springboot为例)
(1)pom:
<dependency> <groupId>net.unicon.cas</groupId> <artifactId>cas-client-autoconfig-support</artifactId> <version>2.2.0-GA</version> </dependency>
(2)application.yml:
server:
port: 9100
#配置ssl
ssl:
#enabled: true
key-store: "classpath:bugbiu.jks"
key-store-password: bugbiu
key-password: bugbiu
#key-alias: cas #server.ssl.keyStoreType=PKCS12
cas:
server-url-prefix: https://localhost:9000/cas
server-login-url: https://localhost:9000/cas/login
#server-logout-url: http://localhost:9000/cas/logout
client-host-url: https://localhost:9100
validation-type: cas
(3)将http转成https (不是必须)
package com.bugbiu.config; import org.apache.catalina.Context; import org.apache.catalina.connector.Connector; import org.apache.tomcat.util.descriptor.web.SecurityCollection; import org.apache.tomcat.util.descriptor.web.SecurityConstraint; import org.springframework.beans.factory.annotation.Value; import org.springframework.boot.web.embedded.tomcat.TomcatServletWebServerFactory; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration;
/**
* 将http转成https,即http://ip/ctx -》https://ip:port/ctx
* @author bugbiu
* 2019/5/10 11:26
* @version 1.0
*/
@Configuration
public class Http2HttpsConfig {
@Value("${server.port}")
private int port;
@Bean
public TomcatServletWebServerFactory servletContainer(Connector connector) { //Springboot2以前TomcatEmbeddedServletContainerFactory、EmbeddedServletContainerCustomizer TomcatServletWebServerFactory tomcat = new TomcatServletWebServerFactory() {
@Override
protected void postProcessContext(Context context) {
SecurityConstraint constraint = new SecurityConstraint(); constraint.setUserConstraint("CONFIDENTIAL");
SecurityCollection collection = new SecurityCollection();
collection.addPattern("/*");
constraint.addCollection(collection);
context.addConstraint(constraint);
} }; tomcat.addAdditionalTomcatConnectors(connector); return tomcat; } @Bean
public Connector httpConnector() {
Connector connector = new Connector("org.apache.coyote.http11.Http11NioProtocol"); connector.setScheme("http"); //Connector监听的http的端口号 connector.setPort(80);//默认80、8080
connector.setSecure(false);//true:同时支持http和https、否则http转https //监听到http的端口号后转向到的https的端口号
connector.setRedirectPort(port);
return connector;
}
对于上述只是CAS使用,如果大家想深入研究CAS框架实现,可以一起探讨探讨,个人使用研究心得,若有错误欢迎指出,谢谢^_^