简单的 CAS 实现 SSO 单点登录

共 5005字,需浏览 11分钟

 ·

2020-09-06 15:48

作者: 範宗雲

http://fanlychie.github.io



环境

  • cas-server-4.1.8

  • cas-client-3.4.0

  • Java-8

  • Maven-3

  • Tomcat-7.0.72

CAS Server 安装

点此进入 CAS 下载列表,选择下载 cas-4.1.8.zip。

https://github.com/apereo/cas/releases

解压缩 cas-4.1.8.zip 并进入 cas-server-webapp 目录,在当前目录打开 cmd 并执行安装命令。

mvn -e -ff clean install -Dmaven.test.skip=true

经亲身测试(自己拉的电信12M网络),该安装过程非常漫长,主要因为镜像原因导致依赖包下载非常慢,此过程需静心等待。或直接下载我已经打好包的 cas.war 文件(注:该文件的依赖包版本有稍做修改,此不影响正常使用)。

安装完成后,在 cas-server-webapp/target 目录下可以看到 cas.war 文件,该文件便是 cas server 应用服务的 war 包。

cas server 安全认证是基于 https 的,这里使用 JDK 自带的 keytool 工具生成数字证书,生产环境系统的应用需要到证书提供商处购买证书。

https://fanlychie.github.io/post/java-keytool-tomcat-https.html

首先确保 Tomcat 的 https 可以正常访问,将 cas.war 文件拷贝到 apache-tomcat-7.0.72/webapps 下进行发布,启动 Tomcat,访问 https://www.fanlychie.com:8443/cas。

上图是用火狐浏览器打开的链接,选择高级 -> 添加例外 -> 确认安全例外。

用户名和密码在 apache-tomcat-7.0.72/webapps/cas/WEB-INF/deployerConfigContext.xml 配置文件中,找到并打开该文件,大概在 105 行

"primaryAuthenticationHandler"
    class="org.jasig.cas.authentication.AcceptUsersAuthenticationHandler">
    <property name="users">
        <map>
            <entry key="casuser" value="Mellon" />
        map>

    property>
bean>

可以看到默认的用户名是 casuser,密码是 Mellon。

看到上图的页面,表明 cas server 已经部署成功。

CAS Server 配置基于数据库用户认证

回到 cas-4.1.8.zip 解压缩的目录,并进入 cas-server-support-jdbc 目录,在当前目录打开 cmd 并执行安装命令

mvn -e -ff clean install -Dmaven.test.skip=true

安装完成后在 target 目录得到 cas-server-support-jdbc-4.1.8.jar 文件。

将该文件拷贝到 apache-tomcat-7.0.72/webapps/cas/WEB-INF/lib 目录下,并向此目录添加 c3p0-0.9.1.2.jar,mysql-connector-java-5.1.17.jar 两个文件。嫌麻烦的话,可以下载这三个jar包。

http://pan.baidu.com/s/1pLIrdWn

再次打开 apache-tomcat-7.0.72/webapps/cas/WEB-INF/deployerConfigContext.xml 文件,大概在第 54 行。

<bean id="authenticationManager" class="org.jasig.cas.authentication.PolicyBasedAuthenticationManager">
    <constructor-arg>
        <map>
            
            <entry key-ref="proxyAuthenticationHandler" value-ref="proxyPrincipalResolver" />
            
            
            <entry key-ref="myAuthenticationHandler" value-ref="primaryPrincipalResolver" />
        map>
    constructor-arg>
    
    
    <property name="authenticationPolicy">
        <bean class="org.jasig.cas.authentication.AnyAuthenticationPolicy" />
    property>
bean>

按以上配置注销掉第二个 entry 并添加一个 entry。接着在后面添加两个 bean 配置。

"dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource" destroy-method="close">
    "jdbcUrl" value="jdbc:mysql://127.0.0.1:3306/cas_test_db?autoReconnect=true&useUnicode=true&characterEncoding=utf-8" />
    "user" value="root" />
    "password" value="root" />
    "driverClass" value="com.mysql.jdbc.Driver" />
    "initialPoolSize" value="10" />
    "maxIdleTime" value="1800" />
    "maxPoolSize" value="60" />
    "acquireIncrement" value="5" />
    "acquireRetryAttempts" value="60" />
    "acquireRetryDelay" value="2000" />
    "breakAfterAcquireFailure" value="false" />
    "autoCommitOnClose" value="false" />
    "checkoutTimeout" value="30000" />
    "idleConnectionTestPeriod" value="900" />

"myAuthenticationHandler" class="org.jasig.cas.adaptors.jdbc.QueryDatabaseAuthenticationHandler" 
    p:dataSource-ref="dataSource" 
    p:sql="SELECT passwd FROM user WHERE name = ?" />

其中 cas_test_db 数据库中的 user 建表语句为

CREATE TABLE `user` (
  `id` int(11NOT NULL AUTO_INCREMENT,
  `name` varchar(255NOT NULL,
  `passwd` varchar(255NOT NULL,
  PRIMARY KEY (`id`)
)

重启 Tomcat,访问 https://www.fanlychie.com:8443/cas,用数据库中的 name/passwd 作为用户名和密码登录系统,若登录成功,表明配置已成功。

CAS Client 客户端使用和配置

使用 maven 创建两个 web 项目 cas-client1,cas-client2。点此下载 demo 文件。

cas-client1 项目 pom.xml 配置

<dependencies>
    <dependency>
        <groupId>org.jasig.cas.clientgroupId>
        <artifactId>cas-client-coreartifactId>
        <version>3.4.0version>
    dependency>
    <dependency>
        <groupId>org.slf4jgroupId>
        <artifactId>slf4j-log4j12artifactId>
        <version>1.7.12version>
    dependency>
dependencies>
<build>
    <plugins>
        <plugin>
            <groupId>org.apache.tomcat.mavengroupId>
            <artifactId>tomcat7-maven-pluginartifactId>
            <version>2.2version>
            <configuration>
                <path>/path>
                <port>8881port>
                <httpsPort>8081httpsPort>
                <uriEncoding>UTF-8uriEncoding>
                <protocol>org.apache.coyote.http11.Http11NioProtocolprotocol>
                <clientAuth>falseclientAuth>
                <keystoreFile>C:\Users\fanlychie\.keystore\selfissue.jkskeystoreFile>
                <keystorePass>123654keystorePass>
                <keystoreType>JKSkeystoreType>
                <url>http://localhost:8081/manager/htmlurl>
            configuration>
        plugin>
    plugins>
build>

首先必须确保项目 https 协议可以正常访问,否则 cas server 无法认证。

选中项目 -> Run As -> Maven build… -> tomcat7:run

访问 https://www.fanlychie.com:8081,若能访问到,表明 Tomcat 已准备好。

cas-client1 项目 web.xml 配置


<web-app version="2.5" xmlns="http://java.sun.com/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd">
    <listener>
        <listener-class>org.jasig.cas.client.session.SingleSignOutHttpSessionListenerlistener-class>
    listener>

    <filter>
        <filter-name>CAS Single Sign Out Filterfilter-name>
        <filter-class>org.jasig.cas.client.session.SingleSignOutFilterfilter-class>
        <init-param>
            <param-name>casServerUrlPrefixparam-name>
            
            <param-value>https://www.fanlychie.com:8443/casparam-value>
        init-param>
    filter>
    <filter-mapping>
        <filter-name>CAS Single Sign Out Filterfilter-name>
        <url-pattern>/*url-pattern>
    filter-mapping>

    <filter>
        <filter-name>CAS Authentication Filterfilter-name>
        <filter-class>org.jasig.cas.client.authentication.AuthenticationFilterfilter-class>
        <init-param>
            <param-name>casServerLoginUrlparam-name>
            
            <param-value>https://www.fanlychie.com:8443/cas/loginparam-value>
        init-param>
        <init-param>
            <param-name>serverNameparam-name>
            
            <param-value>https://www.fanlychie.com:8081param-value>
        init-param>
    filter>
    <filter-mapping>
        <filter-name>CAS Authentication Filterfilter-name>
        <url-pattern>/*url-pattern>
    filter-mapping>
    <filter>
        <filter-name>CAS Validation Filterfilter-name>
        <filter-class>org.jasig.cas.client.validation.Cas20ProxyReceivingTicketValidationFilterfilter-class>
        <init-param>
            <param-name>casServerUrlPrefixparam-name>
            
            <param-value>https://www.fanlychie.com:8443/casparam-value>
        init-param>
        <init-param>
            <param-name>serverNameparam-name>
            
            <param-value>https://www.fanlychie.com:8081param-value>
        init-param>
    filter>
    <filter-mapping>
        <filter-name>CAS Validation Filterfilter-name>
        <url-pattern>/*url-pattern>
    filter-mapping>
    <filter>
        <filter-name>CAS HttpServletRequest Wrapper Filterfilter-name>
        <filter-class>org.jasig.cas.client.util.HttpServletRequestWrapperFilterfilter-class>
    filter>
    <filter-mapping>
        <filter-name>CAS HttpServletRequest Wrapper Filterfilter-name>
        <url-pattern>/*url-pattern>
    filter-mapping>
    <filter>
        <filter-name>CAS Assertion Thread Local Filterfilter-name>
        <filter-class>org.jasig.cas.client.util.AssertionThreadLocalFilterfilter-class>
    filter>
    <filter-mapping>
        <filter-name>CAS Assertion Thread Local Filterfilter-name>
        <url-pattern>/*url-pattern>
    filter-mapping>
    <welcome-file-list>
        <welcome-file>index.jspwelcome-file>
    welcome-file-list>
web-app>

以上是 cas client 标准配置,具体信息可参考 https://github.com/apereo/java-cas-client。

cas-client2 配置基本与 cas-client1 配置相同,详情可见 demo,同时启动这两个项目

cas-client1 - https://www.fanlychie.com:8081
cas-client2 - https://www.fanlychie.com:8082

访问其中的一个项目 https://www.fanlychie.com:8081,会自动跳到

https://www.fanlychie.com:8443/cas/login?service=https%3A%2F%2Fwww.fanlychie.com%3A8081%2F。

由于还没有登录过 CAS 认证系统,CAS 认证系统拦截到你的访问,进入到认证系统登录界面,当登录成功后,CAS 服务会跳转向到你刚刚访问的地址。

当你访问 https://www.fanlychie.com:8082,此时是不需要登录了的。

至此,CAS 实现 SSO 单点登录系统搭建结束。

- END -


1.  8月撸书|当当花160买400,不撸白不撸

2.  两难!到底用Apache BeanUtils还是Spring BeanUtils?

3.  Spring的Controller是单例还是多例?怎么保证并发的安全


之前博主分享了很多资源,有的已经删除了(你懂得),如果有的你当时没有领到还想领得就可以加我微信

回复“权限”获取spring security与spingmvc分布式权限管理系统


好文章,我在看


浏览 36
点赞
评论
收藏
分享

手机扫一扫分享

分享
举报
评论
图片
表情
推荐
点赞
评论
收藏
分享

手机扫一扫分享

分享
举报