从零开始学CAS单点登录——实例Demo

从零开始学CAS单点登录——实例Demo

什么是单点登录

单点登录(Single Sign On),简称为 SSO,是目前比较流行的企业业务整合的解决方案之一。SSO的定义是在多个应用系统中,用户只需要登录一次就可以访问所有相互信任的应用系统。

我们目前的系统存在诸多子系统,而这些子系统是分别部署在不同的服务器中,那么使用传统方式的session是无法解决的,我们需要使用相关的单点登录技术来解决。

 

什么是CAS

CAS 是 Yale 大学发起的一个开源项目,旨在为 Web 应用系统提供一种可靠的单点登录方法,CAS 在 2004 年 12 月正式成为 JA-SIG 的一个项目。CAS 具有以下特点:

【1】开源的企业级单点登录解决方案。

【2】CAS Server 为需要独立部署的 Web 应用。

【3】CAS Client 支持非常多的客户端(这里指单点登录系统中的各个 Web 应用),包括 Java, .Net, PHP, Perl, Apache, uPortal, Ruby 等。

从结构上看,CAS 包含两个部分: CAS Server 和 CAS Client。CAS Server 需要独立部署,主要负责对用户的认证工作;CAS Client 负责处理对客户端受保护资源的访问请求,需要登录时,重定向到 CAS Server。下图是 CAS 最基本的协议过程:

 

SSO单点登录访问流程主要有以下步骤:

1. 访问服务:SSO客户端发送请求访问应用系统提供的服务资源。

2. 定向认证:SSO客户端会重定向用户请求到SSO服务器。

3. 用户认证:用户身份认证。

4. 发放票据:SSO服务器会产生一个随机的Service Ticket。

5. 验证票据:SSO服务器验证票据Service Ticket的合法性,验证通过后,允许客户端访问服务。

6. 传输用户信息:SSO服务器验证票据通过后,传输用户认证结果信息给客户端。

一 在Linux里的Tomcat部署CAS

1.进入路径 

[root@hostname /]# cd usr/local/cas

2.把提前准备好的cas.war 复制到我们所使用的路径中

[root@hostname cas]# cp /root/cas/cas.war ./

3.将准备好的tomcat 放入这个文件夹中 并且解压 更名为tomcat

[root@hostname /]# cp /root/tomcat/apache-tomcat-7.0.47.tar.gz ./

[root@hostname cas]# tar -zxvf apache-tomcat-7.0.47.tar.gz -C ./

[root@hostname cas]# mv apache-tomcat-7.0.47.tar.gz tomcat

4.打开EditPlus 3 利用FTP远程打开文件进行更改配置文件

修改配置文件/usr/local/cas/tomcat/conf/server.xml (三处地方需要更改  原因是端口号冲突)

1.<Server port=”8010″ shutdown=”SHUTDOWN”> 

2.  <Connector port=”9100″ protocol=”HTTP/1.1″
     connectionTimeout=”20000″
        redirectPort=”8443″ />

3.    <Connector port=”8011″ protocol=”AJP/1.3″ redirectPort=”8443″ />

5.我们将复制过来的cas.war包部署到tomcat中(移动到webapps包中 启动tomcat 关闭tomcat 然后删除webapps中的cas.war)

注意一定要关闭tomcat才删除cas.war

[root@hostname cas]# mv cas.log tomcat/webapps/

[root@hostname cas]# sh tomcat/bin/startup.sh

[root@hostname cas]# sh tomcat/bin/shutdown.sh

[root@hostname webapps]# rm -rf cas.war

二 修改相关配置文件

更改配置文件

1.

/usr/local/cas/tomcat/webapps/cas/WEB-INF/cas.properties

server.name=http://192.168.200.128:9100     (将ip改为我们虚拟机的ip 端口号改为之前修改的端口号9100)

2.

/usr/local/cas/tomcat/webapps/cas/WEB-INF/deployerConfigContext.xml

(代码中增加一串代码p:requireSecure=”false”)

class=”org.jasig.cas.authentication.handler.support.HttpBasedServiceCredentialsAuthenticationHandler”
p:httpClient-ref=”httpClient” p:requireSecure=”false”/>   

3.

/usr/local/cas/tomcat/webapps/cas/WEB-INF/spring-configuration/ticketGrantingTicketCookieGenerator.xml

p:cookieSecure 修改为false   p:cookieMaxAge修改为3600

<bean id=”ticketGrantingTicketCookieGenerator” class=”org.jasig.cas.web.support.CookieRetrievingCookieGenerator”
p:cookieSecure=”false”
p:cookieMaxAge=”3600″
p:cookieName=”CASTGC”
p:cookiePath=”/cas” />
</beans>

/usr/local/cas/tomcat/webapps/cas/WEB-INF/spring-configuration/warnCookieGenerator.xml 同理修改

三 启动tomcat 访问192.168.200.128:9100/cas/login

用户名:casuser    密码:Mellon    登录即可

项目Demo

我们创建两个项目来进行测试cas单点登录系统

casDemo01项目:

pom.xml

    <dependencies>
        <dependency>
            <groupId>junit</groupId>
            <artifactId>junit</artifactId>
            <version>4.11</version>
            <scope>test</scope>
        </dependency>
        <dependency>
            <groupId>org.jasig.cas.client</groupId>
            <artifactId>cas-client-core</artifactId>
            <version>3.3.3</version>
        </dependency>
        <dependency>
            <groupId>javax.servlet</groupId>
            <artifactId>servlet-api</artifactId>
            <version>2.5</version>
        </dependency>
    </dependencies>

web.xml

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xmlns="http://java.sun.com/xml/ns/javaee"
         xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"
         version="2.5">

  <!--用于单点退出-->
  <listener>
    <listener-class>org.jasig.cas.client.session.SingleSignOutHttpSessionListener</listener-class>
  </listener>

  <filter>
    <filter-name>CAS Single Sign Out Filter</filter-name>
    <filter-class>org.jasig.cas.client.session.SingleSignOutFilter</filter-class>
  </filter>
  <filter-mapping>
    <filter-name>CAS Single Sign Out Filter</filter-name>
    <url-pattern>/*</url-pattern>
  </filter-mapping>
  <!--用于认证-->
  <filter>
    <filter-name>CASFilter</filter-name>
    <filter-class>org.jasig.cas.client.authentication.AuthenticationFilter</filter-class>
    <init-param>
      <param-name>casServerLoginUrl</param-name>
      <param-value>http://192.168.200.128:9100/cas/login</param-value>

    </init-param>
    <init-param>
      <param-name>serverName</param-name>
      <param-value>http://localhost:9002</param-value>
    </init-param>
  </filter>
  <filter-mapping>
    <filter-name>CASFilter</filter-name>
    <url-pattern>/*</url-pattern>
  </filter-mapping>
  <!--负责校验-->
  <filter>
    <filter-name>CAS Validation Filter</filter-name>
    <filter-class> org.jasig.cas.client.validation.Cas20ProxyReceivingTicketValidationFilter</filter-class>
    <init-param>
      <param-name>casServerUrlPrefix</param-name>
      <param-value>http://192.168.200.128:9100/cas</param-value>
    </init-param>
    <init-param>
      <param-name>serverName</param-name>
      <param-value>http://localhost:9002</param-value>
    </init-param>
  </filter>
  <filter-mapping>
    <filter-name>CAS Validation Filter</filter-name>
    <url-pattern>/*</url-pattern>
  </filter-mapping>
  <!--负责实现request请求的-->
  <filter>
    <filter-name>CAS HttpServletRequest Wrapper Filter</filter-name>
    <filter-class>
      org.jasig.cas.client.util.HttpServletRequestWrapperFilter</filter-class>
  </filter>
  <filter-mapping>
    <filter-name>CAS HttpServletRequest Wrapper Filter</filter-name>
    <url-pattern>/*</url-pattern>
  </filter-mapping>
  <!--开发者可以通过ssertionThreadLocalFilter获取用户名.AssertionThread.getAsssration.getPrincipal.getName-->
  <filter>
    <filter-name>CAS Assertion Thread Local Filter</filter-name>
    <filter-class>org.jasig.cas.client.util.AssertionThreadLocalFilter</filter-class>
  </filter>
  <filter-mapping>
    <filter-name>CAS Assertion Thread Local Filter</filter-name>
    <url-pattern>/*</url-pattern>
  </filter-mapping>
</web-app>

index.jsp

<html>
<body>
<h2>Hello World!</h2>
this  is   demo01
</body>
</html>

casDemo0项目:  pom.xml与demo01相同

web.xml

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xmlns="http://java.sun.com/xml/ns/javaee"
         xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"
         version="2.5">

  <!--用于单点退出-->
  <listener>
    <listener-class>org.jasig.cas.client.session.SingleSignOutHttpSessionListener</listener-class>
  </listener>

  <filter>
    <filter-name>CAS Single Sign Out Filter</filter-name>
    <filter-class>org.jasig.cas.client.session.SingleSignOutFilter</filter-class>
  </filter>
  <filter-mapping>
    <filter-name>CAS Single Sign Out Filter</filter-name>
    <url-pattern>/*</url-pattern>
  </filter-mapping>
  <!--用于认证-->
  <filter>
    <filter-name>CASFilter</filter-name>
    <filter-class>org.jasig.cas.client.authentication.AuthenticationFilter</filter-class>
    <init-param>
      <param-name>casServerLoginUrl</param-name>
      <param-value>http://192.168.200.128:9100/cas/login</param-value>

    </init-param>
    <init-param>
      <param-name>serverName</param-name>
      <param-value>http://localhost:9001</param-value>
    </init-param>
  </filter>
  <filter-mapping>
    <filter-name>CASFilter</filter-name>
    <url-pattern>/*</url-pattern>
  </filter-mapping>
  <!--负责校验-->
  <filter>
    <filter-name>CAS Validation Filter</filter-name>
    <filter-class> org.jasig.cas.client.validation.Cas20ProxyReceivingTicketValidationFilter</filter-class>
    <init-param>
      <param-name>casServerUrlPrefix</param-name>
      <param-value>http://192.168.200.128:9100/cas</param-value>
    </init-param>
    <init-param>
      <param-name>serverName</param-name>
      <param-value>http://localhost:9001</param-value>
    </init-param>
  </filter>
  <filter-mapping>
    <filter-name>CAS Validation Filter</filter-name>
    <url-pattern>/*</url-pattern>
  </filter-mapping>
  <!--负责实现request请求的-->
  <filter>
    <filter-name>CAS HttpServletRequest Wrapper Filter</filter-name>
    <filter-class>
      org.jasig.cas.client.util.HttpServletRequestWrapperFilter</filter-class>
  </filter>
  <filter-mapping>
    <filter-name>CAS HttpServletRequest Wrapper Filter</filter-name>
    <url-pattern>/*</url-pattern>
  </filter-mapping>
  <!--开发者可以通过ssertionThreadLocalFilter获取用户名.AssertionThread.getAsssration.getPrincipal.getName-->
  <filter>
    <filter-name>CAS Assertion Thread Local Filter</filter-name>
    <filter-class>org.jasig.cas.client.util.AssertionThreadLocalFilter</filter-class>
  </filter>
  <filter-mapping>
    <filter-name>CAS Assertion Thread Local Filter</filter-name>
    <url-pattern>/*</url-pattern>
  </filter-mapping>
</web-app>

index.jsp

<html>
<body>
<h2>Hello World!</h2>
this is casDemo0
</body>
</html>

结果:

当我们访问demo0进行登录的时候 再次访问demo01就不需要进行登录可以直接访问

cas与mysql数据库远程连接:

配置cas集成数据库,实现动态账号密码

1、开启mysql数据库的root账号的远程连接权限

USR MYSQL;

UPDATE USER SET HOST=’%’ WHERE USER=’root’;

FLUSH PRIVILEGES;

2、在配置文件添加如下配置

1、修改配置文件

cas/WEB-INF/deployerConfigContext.xml

新增如下配置:

<bean id=”dataSource” class=”com.mchange.v2.c3p0.ComboPooledDataSource”
p:driverClass=”com.mysql.jdbc.Driver”
p:jdbcUrl=”jdbc:mysql://192.168.188.1:3306/youlexuandb?characterEncoding=utf8″
p:user=”root”
p:password=”123″ />
<bean id=”passwordEncoder”
class=”org.jasig.cas.authentication.handler.DefaultPasswordEncoder”
c:encodingAlgorithm=”MD5″
p:characterEncoding=”UTF-8″ />
<bean id=”dbAuthHandler”
class=”org.jasig.cas.adaptors.jdbc.QueryDatabaseAuthenticationHandler”
p:dataSource-ref=”dataSource”
p:sql=”select password from tb_user where username = ?”
p:passwordEncoder-ref=”passwordEncoder”/>

2、找到bean id 为authenticationManager

修改其中的:<entry key-ref=”primaryAuthenticationHandler” value-ref=”primaryPrincipalResolver” />

改成:<entry key-ref=”dbAuthHandler” value-ref=”primaryPrincipalResolver”/>

3、上传相关jar包到cas/WEB-INF/lib目录

c3p0-0.9.1.2.jar
cas-server-support-jdbc-4.0.0.jar
mysql-connector-java-5.1.32.jar

4、重启cas所在tomcat服务器

最后就可以直接用数据库的数据进行cas登录

ps:我在运行过程中遇到一个错误 登录时一直在响应最后

页面反应是:CAS is Unavailable
There was an error trying to complete your request. Please notify your support desk or try again. 

有可能是防火墙的原因 我将防火墙关闭 重启就可以了

Published by

风君子

独自遨游何稽首 揭天掀地慰生平

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注