美文网首页
CAS单点登录示例

CAS单点登录示例

作者: FuriousPws002 | 来源:发表于2020-07-15 20:15 被阅读0次

    摘要

    CAS Server Cas Client Pac4j

    什么是单点登录

    单点登录(Single Sign On),简称 SSO,常用于多个系统中,用户只需登录一次,就可以访问其他信任的系统。比如,员工登录过OA系统后,可以直接访问邮件系统,而不再需要登录邮件系统。这里的OA系统和邮件系统,可以认为是相互信任的子系统,他们共用一套用户数据,这套用户数据的权限认证由统一的认证服务器来认证。

    CAS协议

    现阶段比较流行的单点登录解决方案是CAS(Central Authentication Service),官网中有如下说明

    Enterprise Single Sign-On - CAS provides a friendly open source community that actively supports and contributes to the project. While the project is rooted in higher-ed open source, it has grown to an international audience spanning Fortune 500 companies and small special-purpose installations.

    CAS提供了CAS协议来完成单点登录,主要流程如下

    1. 用户第一次向浏览器访问应用1(https://app.example.com),应用1判断用户没有登录,重定向到CAS server(https://cas.example.com/cas/login?service=https://app.example.com)

    2. CAS server中判断当前用户的sso的session不存在,展示用户名密码输入框

    3. 用户输入用户名密码向CAS server登录,验证通过后,CAS server 生成sso的session,向浏览器设置cookie,CASTGC=TGT-...
      其中cookie的值就是sso中session的key。同时CAS server会对应用1生成一个ticket,再去重定向到应用1中,应用1拿到这个ticket再次请求CAS server获取授权数据。成功后,设置cookie,jessionid=...。到此,应用1第一次认证结束。

    4. 当应用1第二次认证的时候直接校验jessionid是否合法即可。

    5. 当应用2第一次访问的时候,同样会重定向到CAS server中去,只不过,此时,由于,应用1已经认证通过了,同时sso的session已经保存了,所以,CAS server不会再去要求用户登录,而是直接对应用2生成一个ticket,后面的逻辑就和前面一样了。

    代码演示

    下面的代码都可以在cas-pac4j-example下载
    本机环境说明

    • jdk 1.8
    • maven 3.6.3
    • mysql 5.7.29
    • cas server 5.3.14
    • cas client 3.6.1
    • shiro 1.5.3
    • pac4j 4.0.3

    cas服务端

    直接clone官方提供的overlaygit clone https://github.com/apereo/cas-overlay-template.git
    由于最新版6.3.x需要jdk11的支持,所以切换了5.3的分支
    添加了src/main/resources/目录,在改目录下创建了application.properties文件和services目录,用于cas server的自定义认证方式。
    由于认证数据依赖数据库,请先运行sql文件,更改application.properties的数据库连接信息。
    修改pom文件,添加如下依赖

            <dependency>
                <groupId>org.apereo.cas</groupId>
                <artifactId>cas-server-support-rest</artifactId>
                <version>${cas.version}</version>
            </dependency>
            <dependency>
                <groupId>mysql</groupId>
                <artifactId>mysql-connector-java</artifactId>
                <version>${mysql.version}</version>
            </dependency>
            <dependency>
                <groupId>org.apereo.cas</groupId>
                <artifactId>cas-server-support-jdbc</artifactId>
                <version>${cas.version}</version>
            </dependency>
            <dependency>
                <groupId>org.apereo.cas</groupId>
                <artifactId>cas-server-support-jdbc-drivers</artifactId>
                <version>${cas.version}</version>
            </dependency>
    

    命令行运行mvn clean package & java -jar target/cas.war等待服务启动后,访问http://locahost:8443/cas,会跳转登录,输入u/p登录成功。到此,cas服务端算是ok了。

    cas客户端

    新建spring boot项目cas-client2cas-client3,其中cas-client2的端口为8082,cas-client3的端口为8083,pom中添加如下依赖

            <dependency>
                <groupId>org.jasig.cas.client</groupId>
                <artifactId>cas-client-support-springboot</artifactId>
                <version>${cas.client.version}</version>
            </dependency>
            <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-starter-web</artifactId>
            </dependency>
    
            <dependency>
                <groupId>org.projectlombok</groupId>
                <artifactId>lombok</artifactId>
                <optional>true</optional>
            </dependency>
    

    添加注解@EnableCasClient启用casClient,application中添加如下cas服务配置

    cas.server-url-prefix=http://localhost:8443/cas
    cas.server-login-url=${cas.server-url-prefix}/login
    cas.client-host-url=http://localhost:${server.port}
    

    启动客户端cas-client2和cas-client3,访问http://localhost:8082,会跳转cas登录,然后在访问http://localhost:8083,会发现已经认证通过,不会跳转cas登录,达到了单点登录的效果。

    客户端shiro集成cas服务认证

    现实的系统中可能不是像上面那样简单的配置,可能客户端先前已经集成了shiro等权限框架,后面再接入cas认证,这种情况怎么处理呢?
    新建spring boot项目cas-client1
    pom中添加入下依赖

            <dependency>
                <groupId>io.buji</groupId>
                <artifactId>buji-pac4j</artifactId>
                <version>${buji.version}</version>
            </dependency>
            <dependency>
                <groupId>org.pac4j</groupId>
                <artifactId>pac4j-cas</artifactId>
                <version>${pac4j.version}</version>
            </dependency>
            <dependency>
                <groupId>org.apache.shiro</groupId>
                <artifactId>shiro-spring-boot-web-starter</artifactId>
                <version>${shiro.version}</version>
            </dependency>
    

    application.properties的配置如下

    server.port=8081
    
    cas.server-url-prefix=http://localhost:8443/cas
    cas.server-login-url=${cas.server-url-prefix}/login
    cas.client-host-url=http://localhost:${server.port}
    cas.client-name=app-client1
    
    shiro.loginUrl=/login.html
    
    

    主类中CasClient1Application添加了cas认证的相关配置,而TestController则包含了单纯的shiro登录和cas的rest方式登录。
    启动后,访问http://localhost:8081/cas.html,会跳转到CAS Server去认证,认证完成后,访问http://localhost:8081/test可以测试权限数据是否正确,CAS Server除了采用CAS本身的login登录界面外,还支持rest的方式,获取认证,访问http://localhost:8081/login.html,输入u/p后会通过rest的方式认证。

    相关文章

      网友评论

          本文标题:CAS单点登录示例

          本文链接:https://www.haomeiwen.com/subject/rnbdhktx.html