首页 > 技术文章 > CAS 单点登录 服务器整合

yg_zhang 2018-04-02 15:29 原文

概述

现在企业内部的系统越来越多,如果各个应用都有自己的用户系统,那么用户将不得不要记住不同系统的用户名密码,因此独立的用户系统应运而生,各个系统之间通过单点登录的方式,这样内部只需要记住一个用户名和密码,就可以自由的访问有权限的系统。

单点登录的实现

1.我们采用cas server 实现单点登录,下载地址是:

http://developer.jasig.org/cas/cas-server-4.0.0-release.zip

2.CAS 配置修改

 

将包解压,我们可以看到如下目录

将war 文件进行解压。

1.去掉https验证。

CAS 默认认证方式使用的是HTTPS协议,一般对安全性不高的话建议取消改成HTTP方式。因为,开启的话会经常提示证书过期、需要用户确认等,对客户的感知不好,当前有需要的可以开启。

打开 cas-server\WEB-INF\deployerConfigContext.xml 文件 ,找到如下配置:

<bean id="proxyAuthenticationHandler"
          class="org.jasig.cas.authentication.handler.support.HttpBasedServiceCredentialsAuthenticationHandler"
          p:httpClient-ref="httpClient" />

改成:

<bean id="proxyAuthenticationHandler"
          class="org.jasig.cas.authentication.handler.support.HttpBasedServiceCredentialsAuthenticationHandler"
          p:httpClient-ref="httpClient" p:requireSecure="false" />

打开 cas-server\WEB-INF\spring-configuration\ticketGrantingTicketCookieGenerator.xml ,找到如下配置:

<bean id="ticketGrantingTicketCookieGenerator" class="org.jasig.cas.web.support.CookieRetrievingCookieGenerator"
        p:cookieSecure="true"
        p:cookieMaxAge="-1"
        p:cookieName="CASTGC"
        p:cookiePath="/cas" />

改成:

<bean id="ticketGrantingTicketCookieGenerator" class="org.jasig.cas.web.support.CookieRetrievingCookieGenerator"
        p:cookieSecure="false"
        p:cookieMaxAge="-1"
        p:cookieName="CASTGC"
        p:cookiePath="/cas" />

打开 cas-server\WEB-INF\spring-configuration\warnCookieGenerator.xml ,找到如下配置

<bean id="warnCookieGenerator" class="org.jasig.cas.web.support.CookieRetrievingCookieGenerator"
        p:cookieSecure="true"
        p:cookieMaxAge="-1"
        p:cookieName="CASPRIVACY"
        p:cookiePath="/cas" />

改成

<bean id="warnCookieGenerator" class="org.jasig.cas.web.support.CookieRetrievingCookieGenerator"
        p:cookieSecure="false"
        p:cookieMaxAge="-1"
        p:cookieName="CASPRIVACY"
        p:cookiePath="/cas" />

2.修改成数据库验证用户

在默认情况下,cas使用了固定用户进行登录,我们需要改成数据库用户的验证。

我们目前产品中使用了多租户的SAAS模式,因此用户名 为 帐号加 域名的形式 如 admin@mycine.cn

我们做如下修改:

1.在 WEB-INF 增加 数据库连接池的jar和 mysql驱动的jar包。

mysql-connector-java-5.1.34.jar

druid-1.0.26.jar

2.打开配置文件

WEB-INF/deployerConfigContext.xml

增加数据源配置:

<bean id="dataSource" class="com.alibaba.druid.pool.DruidDataSource" init-method="init" destroy-method="close"> 
          <!-- 基本属性 url、user、password -->
          <property name="name" value="系统数据源" />
          <property name="url" value="${db.url}" />
          <property name="username" value="${db.username}" />
          <property name="password" value="${db.password}" />
    
          <!-- 配置初始化大小、最小、最大 -->
          <property name="initialSize" value="${db.minimumConnectionCount}" />
          <property name="minIdle" value="${db.minimumConnectionCount}" /> 
          <property name="maxActive" value="${db.maximumConnectionCount}" />
    
          <!-- 配置获取连接等待超时的时间 -->
          <property name="maxWait" value="60000" />
    
          <!-- 配置间隔多久才进行一次检测,检测需要关闭的空闲连接,单位是毫秒 -->
          <property name="timeBetweenEvictionRunsMillis" value="60000" />
    
          <!-- 配置一个连接在池中最小生存的时间,单位是毫秒 -->
          <property name="minEvictableIdleTimeMillis" value="300000" />
    
          <property name="validationQuery" value="SELECT 1" />
          <property name="testWhileIdle" value="true" />
          <property name="testOnBorrow" value="false" />
          <property name="testOnReturn" value="false" />
    
          <!-- 打开PSCache,并且指定每个连接上PSCache的大小 -->
          <property name="poolPreparedStatements" value="true" />
          <property name="maxPoolPreparedStatementPerConnectionSize" value="20" />
    
          <!-- 配置监控统计拦截的filters -->
          <property name="filters" value="stat" /> 
      </bean>

修改验证方式:

 <bean id="primaryAuthenticationHandler" class="org.jasig.cas.adaptors.jdbc.QueryDatabaseAuthenticationHandler">

                <property name="dataSource" ref="dataSource" />

                <property name="sql" value="select pwd_ from sys_account where name_ = ? and domain_=?" />
                
                <property name="passwordEncoder" ref="passwordEncoder"></property>

    </bean>

这里SQL 我们自己定义。

 

修改密码加密方式

 <bean id="passwordEncoder" class="com.redxun.cas.MyPasswordEncoder"></bean>

修改成 sha256的方式进行hash。

import java.security.MessageDigest;

import org.apache.commons.codec.binary.Base64;
import org.jasig.cas.authentication.handler.PasswordEncoder;

public class MyPasswordEncoder implements PasswordEncoder {

    @Override
    public String encode(String pwd) {
        String encPwd=encryptSha256(pwd);
        
        return encPwd;
    }

    private   String encryptSha256(String inputStr) {
        try {
            MessageDigest md = MessageDigest.getInstance("SHA-256");
            byte digest[] = md.digest(inputStr.getBytes("UTF-8"));
            return new String(Base64.encodeBase64(digest));
        } catch (Exception e) {
            return null;
        }
    }
}

修改QueryDatabaseAuthenticationHandler代码。

红框部分是修改的地方。

增加属性配置:

修改 WEB-INF/cas.properties 文件

 

增加配置如下:

db.url=jdbc:mysql://localhost:3306/mycine?useUnicode=true&amp;characterEncoding=utf-8
db.username=root
db.password=root

db.minimumConnectionCount=10
db.maximumConnectionCount=20

这样cas 就支持使用数据库进行用户验证了。

 

推荐阅读