计算机系统应用教程网站

网站首页 > 技术文章 正文

单点登陆CAS的学习 单点登录cas原理

btikc 2024-10-01 08:29:23 技术文章 11 ℃ 0 评论

单点登陆

单点登陆这个词并不陌生,单点登陆(Single Sign On),简称为 SSO,在多个应用系统中,用户只需登陆一次就可以访问其他相互信用的系统,不要重复的登陆。

CAS

CAS是Central Authentication Service的缩写,中央认证服务,一种独立开放指令协议。CAS 是 耶鲁大学(Yale University)发起的一个开源项目,旨在为 Web 应用系统提供一种可靠的单点登录方法,CAS 在 2004 年 12 月正式成为 JA-SIG 的一个项目。

特点

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

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

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

4、CAS属于Apache 2.0许可证,允许代码修改,再发布(作为开源或商业软件)。

原理步骤

从结构上看,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服务器验证票据通过后,传输用户认证结果信息给客户端。

CAS的服务端搭建

服务端搭建

下载cas的服务端的war包。该文版本:cas-server-4.0.0-release。

链接:https://pan.baidu.com/s/1Ldzu4xvbWlwZV3hcL0p6xA 提取码:vwwm

将cas-server-4.0.0\modules下的cas-server-webapp-4.0.0.war放入tomcat的wepapps目录下。

启动tomcat。浏览器输入localhost:8080/cas/login

默认账号密码:casuser,Mellon。

登陆为:localhost:8080/cas/logout

服务器其他配置

1.这里默认使用8080端口,可以修改端口。

1)打开tomcat 目录 conf\server.xml 找到下面的配置

将8080端口修改为你配置的端口,这里设置为9000。

2)修改CAS配置文件

修改cas的WEB-INF/cas.properties

3)重启tomcat

2.去除https认证

CAS默认使用的是HTTPS协议,如果使用HTTPS协议需要SSL安全证书(需向特定的机构申请和购买) 。如果对安全要求不高或是在开发测试阶段,可使用HTTP协议。我们这里讲解通过修改配置,让CAS使用HTTP协议。

1)修改cas的WEB-INF/deployerConfigContext.xml找到下面的配置:

增加参数p:requireSecure="false",requireSecure:是否需要安全验证,即HTTPS,false为不采用。

2)修改cas的/WEB-INF/spring-configuration/ticketGrantingTicketCookieGenerator.xml

将参数p:cookieSecure="true",改为p:cookieSecure="false"。true为采用HTTPS验证,false为不验证。

将 p:cookieMaxAge="-1"改成p:cookieMaxAge="3600"。

参数p:cookieMaxAge="-1",是COOKIE的最大生命周期,-1为无生命周期,即只在当前打开的窗口有效,关闭或重新打开其它窗口,仍会要求验证。可以根据需要修改为大于0的数字,比如3600等,意思是在3600秒内,打开任意窗口,都不需要验证。

3)修改cas的WEB-INF/spring-configuration/warnCookieGenerator.xml

将参数p:cookieSecure="true",改为p:cookieSecure="false",将 p:cookieMaxAge="-1"改成p:cookieMaxAge="3600"。

3.添加其他账号

1)修改cas的WEB-INF/deployerConfigContext.xml找到下面的配置:

2)添加一个用户,账号admin,密码admin。


3)重启tomcat

输入admin,admin登陆成功。

CAS的客户端搭建

创建了两个客户端。新建两个个maven项目,cas_demo1和cas_demo2。

pom.xml添加如下依赖:

   <groupId>com.cas.test</groupId>
    <artifactId>cas_demo1</artifactId>
    <version>1.0-SNAPSHOT</version>
    <packaging>war</packaging>

    <dependencies>
        <!-- cas -->
        <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>
            <scope>provided</scope>
        </dependency>
    </dependencies>

    <build>
        <plugins>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-compiler-plugin</artifactId>
                <version>2.3.2</version>
                <configuration>
                    <source>1.7</source>
                    <target>1.7</target>
                </configuration>
            </plugin>
            <plugin>
                <groupId>org.apache.tomcat.maven</groupId>
                <artifactId>tomcat7-maven-plugin</artifactId>
                <configuration>
                    <!-- 指定端口 -->
                    <port>9001</port>
                    <!-- 请求路径 -->
                    <path>/</path>
                </configuration>
            </plugin>
        </plugins>
    </build>

修改web.xml:


  <!-- 用于单点退出,该过滤器用于实现单点登出功能,可选配置 -->  
    <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://localhost:9000/cas/login</param-value>  
            <!--这里的server是服务端的IP -->  
        </init-param>  
        <init-param>  
            <param-name>serverName</param-name>  
                <!--这里的本机的IP地址,用于认证成功的重定向 --> 
            <param-value>http://localhost:9001</param-value>
        </init-param>  
    </filter>  
    <filter-mapping>  
        <filter-name>CASFilter</filter-name>  
        <url-pattern>/*</url-pattern>  
    </filter-mapping>  
  
    <!-- 该过滤器负责对Ticket的校验工作,必须启用它 -->  
    <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://localhost:9000/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>  
  
    <!-- 该过滤器负责实现HttpServletRequest请求的包裹, 比如允许开发者通过HttpServletRequest的getRemoteUser()方法获得SSO登录用户的登录名,可选配置。 -->  
    <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>  
  
    <!-- 该过滤器使得开发者可以通过org.jasig.cas.client.util.AssertionHolder来获取用户的登录名。 比如AssertionHolder.getAssertion().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> 
    
   <welcome-file-list>
        <welcome-file>/WEB-INF/index.jsp</welcome-file>
    </welcome-file-list>

index.jsp只是简单的显示登陆的账号和成功信息。

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>cas-client-demo1</title>
</head>
<body>
登陆成功,用户名: <%=request.getRemoteUser() %>

<a href="http://localhost:9000/cas/logout?service=http://localhost:9000/cas/login">退出登录</a>
</body>
</html>

cas_demo2客户端的代码类似,只是pom.xml,web.xml的中的端口配置为9002。

启动cas_demo1和cas_demo2。

地址栏输入http://localhost:9001/和http://localhost:9002/ ,地址均会跳转到CAS登录页。

输入用户名和密码后,页面跳转回9001的主页面 ,再次访问9002也可以打开主页面。

点击退出登陆并不能跳转,这时需要添加其他的配置。

修改cas系统的配置文件cas-servlet.xml。


将cas.logout.followServiceRedirects:false改为true。重启后,点击退出登陆,跳转成功。

CAS服务端数据源设置

一般用户的账号名密码存在数据库中,这里从数据库中获取账号密码验证登陆。

修改cas服务端中web-inf下deployerConfigContext.xml ,添加如下配置

<bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource"  
			  p:driverClass="com.mysql.jdbc.Driver"  
			  p:jdbcUrl="jdbc:mysql://127.0.0.1:3306/test?characterEncoding=utf8"  
			  p:user="root"  
			  p:password="" /> 
          
<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 sys_user where username = ?"  
		  p:passwordEncoder-ref="passwordEncoder"/> 

然后在配置文件开始部分找到如下配置。

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

其中

<entry key-ref="primaryAuthenticationHandler" value-ref="primaryPrincipalResolver" />

一句是使用固定的用户名和密码,我们在下面可以看到这两个bean ,如果我们使用数据库认证用户名和密码,需要将这句注释掉。

添加下面这一句配置

<entry key-ref="dbAuthHandler" value-ref="primaryPrincipalResolver"/>

将以下三个jar包放入webapps\cas\WEB-INF\lib下 。重启服务。

test数据库中有个sys_user表,其中用户为test,密码为test,已加密。

输入地址,用数据库中用户测试登陆,测试成功。


Tags:

本文暂时没有评论,来添加一个吧(●'◡'●)

欢迎 发表评论:

最近发表
标签列表