单点登陆CAS的学习

单点登陆CAS的学习

首页角色扮演代号侠更新时间:2024-04-29
单点登陆

单点登陆这个词并不陌生,单点登陆(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,已加密。

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

查看全文
大家还看了
也许喜欢
更多游戏

Copyright © 2024 妖气游戏网 www.17u1u.com All Rights Reserved