zoukankan      html  css  js  c++  java
  • 基于CAS的单点登录实战(1)-- 搭建cas服务器

    公司有几个系统想做SSO,然后开始研究cas。系统是Centos7
    

    搭建CAS服务器#

    cas的版本比较多,先在网上搜了一下各种教程配置经验。本来想搭建最新的CAS版本,然而为了快速部署,选择了网上教程比较详细的cas-4.0.0版本。

    1. 安装包和环境依赖
      cas-server是依赖jdk,tomcat,spring等,jdk和tomcat装最新版本就可以了,cas-server这里选了4.0.0.因为版本不同配置还有是区别的,所以这里强调一下版本。因为没玩过JAVA,spring framework我没装,可能是tomcat自带的。。新版本的cas-server好像是通过maven来装,具体怎么装我不知道。。但是有点想研究,看以后会不会填坑。
      1.1 jdk
      yum install 安装貌似默认是1.7,然后我选了1.8
      1.2 tomcat
      yum install 安装最新版
      1.3 spring framework
      我没装。。然后没啥影响。。
      1.3 cas-server-4.0.0
      在cas官网下载的,速度超级慢。不知道有没有镜像。下载完成然后解压。进入文件夹 找到cas-server-4.0.0/modules/cas-server-webapp-4.0.0.war这个 war 文件,拷贝到tomcat的webapps目录下。默认目录在/usr/local/tomcat/webapps/。以前没玩过JAVA不知道,原来war文件拷贝过来就会马上自动解压成文件夹,然后war移动或删除那个同名文件压也会被删!modules 目录下的其他jar是可能需要的依赖包,放到webapps下面自动生成的文件夹里的WEB-INF/lib/下,比如我这里叫cas-server-webapp-4.0.0/WEB-INF/lib/。然后启动tomcat,在浏览器打开。
      tomcat的启动和关闭在tomcat目录下的bin/目录的shutdown.shstartup.sh:
      tomcat重启
      (吐槽下tomcat的重启慢到令人发指,推荐一个解决办法

    2. 导入证书OR去除https限制
      2.1 生成ssl证书
      cas默认使用https,需要ssl证书。我跟着步骤生成了一个crt证书,然后就不知道干嘛了。所以还是老老实实用http跑通再说。
      2.2 去除https限制
      主要有3个地方需要修改:
      2.21 WEB-INF/deployerConfigContext.xml 找到 proxyAuthenticationHandle 添加属性 p:requireSecure="false".

        <bean id="proxyAuthenticationHandler"
              class="org.jasig.cas.authentication.handler.support.HttpBasedServiceCredentialsAuthenticationHandler"
              p:httpClient-ref="httpClient"
              p:requireSecure="false" />
    
    2.22 `WEB-INF/spring-configuration/ticketGrantingTicketCookieGenerator.xml` 将 `p:cookieSecure="true"` 改为 `p:cookieSecure="false"`
    
        <bean id="ticketGrantingTicketCookieGenerator" class="org.jasig.cas.web.support.CookieRetrievingCookieGenerator"
              p:cookieSecure="false"
              p:cookieMaxAge="-1"
              p:cookieName="CASTGC"
              p:cookiePath="/cas" />
    
    2.23 `WEB-INF/spring-configuration/warnCookieGenerator.xml` 将 `p:cookieSecure="true"` 改为 `p:cookieSecure="false"`。 同上
    
    1. 验证方式
      比较好奇应该90%都会使用数据库的用户和密码进行认证吧,为啥cas的默认认证方式不设置成数据库方式呢。难道是为了给用户自己选择数据库的自由?这里主要是3个XML属性配置
      3.0 依赖包
      +. mysql-connector-java-5.1.42.jar 跟版本关系不大
      +. c3p0-0.9.1.2.jar 这个很关键
      +. cas-server-support-jdbc-4.0.0.jar 注意跟cas-server版本一致
      3.1 数据源(数据库配置)
        <bean id="dataSource"
              class="com.mchange.v2.c3p0.ComboPooledDataSource"
              p:driverClass="${database.driverClass}"
              p:jdbcUrl="${database.url}"
              p:user="${database.user}"
              p:password="${database.password}" />
    
    网上配置教程大都是直接把配置写到这里,我这里建议用官方文档的变量方式,一来避免`jdbcUrl`的特殊字符编码问题,而来方便修改配置。这些变量都可以在同目录下的 `cas.properties`中配置 
    
        # == Basic database connection pool configuration ==
        database.driverClass=com.mysql.jdbc.Driver
        database.url=jdbc:mysql://localhost:3306/cas_test?useUnicode=true&characterEncoding=UTF8
        database.user=root
        database.password=root
    

    3.2 加密算法

        <bean id="passwordEncoder"
            class="org.jasig.cas.authentication.handler.DefaultPasswordEncoder"
            c:encodingAlgorithm="SHA1"
            p:characterEncoding="UTF-8" />
    
    系统自带MD5和SHA1加密算法,可以自定义,然而因为我没搞过JAVA所以就停留在这一步,没有深入研究。
    

    3.3 认证方式

        <bean id="dbAuthHandler"
            class="org.jasig.cas.adaptors.jdbc.QueryDatabaseAuthenticationHandler"
            p:dataSource-ref="dataSource"
            p:passwordEncoder-ref="passwordEncoder"
            p:sql="SELECT `password` FROM `cas_user` WHERE `username`=?" />
    
    可以看出上面2个配置项都是给这个做铺垫。这个SQL语句根据自己的数据库进行查询。网上教程有提到还有一个地方要修改
    
            <entry key-ref="proxyAuthenticationHandler" value-ref="proxyPrincipalResolver" />
            <!-- <entry key-ref="primaryAuthenticationHandler" value-ref="primaryPrincipalResolver" /> -->
            <entry key-ref="dbAuthHandler" value-ref="primaryPrincipalResolver" />
    
    个人理解这里不一定要改成这样,如果保留原来的`primaryAuthenticationHandler`那么需要把原来的`<bean id="primaryAuthenticationHandler"...`给注释掉。而另指定一个认证器`dbAuthHandler`就可以不用注释掉原来的。到这里配置完成。
    

    我在这里配置了无数遍,然后各种错误。而且我又不知道怎么查看java/tomcat错误,最后莫名其妙成功了。总结一下可能出错的地方:
    dataSource 中的 class , 网上有的给出来的不一样,建议以官网为主
    jdbcUrl 可能有特殊字符编码问题,建议写到 cas.properties
    依赖包不对

    1. 返回用户信息
      4.1 从数据库查询更多信息
        <!-- 查询更多用户字段 -->
        <bean  class="org.jasig.services.persondir.support.jdbc.SingleRowJdbcPersonAttributeDao" id="attributeRepository">
            <constructor-arg index="0" ref="dataSource"/>
            <!-- 这里配置查询语句, {0},{1}对应接下来的`queryAttributeMapping`的map索引 -->
            <constructor-arg index="1" value="select * from cas_user where {0}"/>
            <property name="queryAttributeMapping">
                <map>
                    <!--这里的key需写username和登录页面一致,value对应数据库用户名字段-->
                    <entry key="username" value="username"/>
                </map>
            </property>
            <property name="resultAttributeMapping">
                <map>
                    <!--key为对应的数据库字段名称,value为提供给客户端获取的属性名字,系统会自动填充值-->
                    <entry key="id" value="uid"/>
                    <entry key="username" value="username"/>
                    <entry key="password" value="password"/>
                    <entry key="email" value="email"/>
                    <entry key="cnName" value="cname"/>
                </map>
            </property>
            <!--    
            <property name="queryType">  
                <value>OR</value>  
            </property>   
            -->
        </bean>
    
    4.2 配置返回字段
    
        <util:list id="registeredServicesList">
            <bean class="org.jasig.cas.services.RegexRegisteredService"
                  p:id="0" p:name="HTTP and IMAP" p:description="Allows HTTP(S) and IMAP(S) protocols"
                  p:serviceId="^(https?|imaps?)://.*" p:evaluationOrder="10000001">
            <!-- 这里是重点 -->
            <property name="allowedAttributes">
                  <list>
                      <value>uid</value>
                      <value>username</value>
                      <value>password</value>
                      <value>email</value>
                      <value>cname</value>
                  </list>
              </property>
            </bean>
        ...
    

    到这里cas服务端的配置基本完成了。good luck。

  • 相关阅读:
    scala 获取当前时间的两种方式
    log4j配置输出日志文件
    scala读取jar包外配置文件的方式
    scala 异常处理机制
    IDEA 安装scala插件
    第2部分 Elasticsearch查询-请求体查询、排序
    第1部分 Elasticsearch基础
    2.css
    1.html
    Linux搭建Nexus仓库+高可用方案
  • 原文地址:https://www.cnblogs.com/dapianzi/p/7196457.html
Copyright © 2011-2022 走看看