单点登录

1.什么是单点登录

CAS ( Central Authentication Service ) 是 Yale 大学发起的一个企业级的、开源的项目,旨在为 Web 应用系统提供一种可靠的单点登录解决方法(属于 Web SSO )。CAS 开始于 2001 年, 并在 2004 年 12 月正式成为 JA-SIG 的一个项目。

 

2.使用场景和实现流程

✪使用场景:一般解决多个系统重复登录的问题,通过单点登录只需要一次登录就可以在多个系统之间安全访问。

✪实现的流程基础模式 SSO 访问流程主要有以下步骤:

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

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

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

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

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

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

下面是 CAS 最基本的协议过程:

 

CAS实现SSO单点登录原理

基础协议图

如 上图: CAS Client 与受保护的客户端应用部署在一起,以 Filter 方式保护 Web 应用的受保护资源,过滤从客户端过来的每一个 Web 请求,同 时, CAS Client 会分析 HTTP 请求中是否包含请求 Service Ticket( ST 上图中的 Ticket) ,如果没有,则说明该用户是没有经过认证的;于是 CAS Client 会重定向用户请求到 CAS Server ( Step 2 ),并传递 Service (要访问的目的资源地址)。 Step 3 是用户认证过程,如果用户提供了正确的 Credentials , CAS Server 随机产生一个相当长度、唯一、不可伪造的 Service Ticket ,并缓存以待将来验证,并且重定向用户到 Service 所在地址(附带刚才产生的 Service Ticket ) , **并为客户端浏览器设置一个 Ticket Granted Cookie ( TGC ) **; CAS Client 在拿到 Service 和新产生的 Ticket 过后,在 Step 5 和 Step6 中与 CAS Server 进行身份核实,以确保 Service Ticket 的合法性。

在该协议中,所有与 CAS Server 的交互均采用 SSL 协议,以确保 ST 和 TGC 的安全性。协议工作过程中会有 **2 次重定向 **的过程。但是 CAS Client 与 CAS Server 之间进行 Ticket 验证的过程对于用户是透明的(使用 HttpsURLConnection )。

 

CAS 请求认证时序图如下:

单点登录_第1张图片

CAS实现SSO单点登录原理

 

3.案例练习

准备两个客户端(cas client)和一个服务端(cas servers)

1.服务端准备

1.准备证书

这里注意设置CN的值得时候设置的域名要和下面设置host的域名一样

单点登录_第2张图片

 

 

2.准备一个干净的tomcat

tomcat下载地址:http://tomcat.apache.org/download-80

单点登录_第3张图片

自己没有域名,本机测试修改host文件利用本机的本地ip模拟一个域名

windows路径:C:\Windows\System32\drivers\etc   查看ip: ipconfig

mac: sudo vi /etc/hosts  查看ip: ifconfig

 

单点登录_第4张图片

 

3.在tomcat导入我们的cas服务端的war包,并更具自己的需要修改cas服务端配置

cas服务端的war包:https://pan.baidu.com/s/1TjKD2avZMPJndfijF61npA

默认登录名和密码在web-inf下deployerConfigContext.xml 里面xml写死配置的,真实使用肯定是配置数据库查表中的用户名密码的,我们先看下xml写死配置在那个位置

单点登录_第5张图片

下面是修改配置文件,连接数据库,我们以mysql为例,如果是oracle,连接配置和jar换成oracle就行

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

  p:driverClass="com.mysql.jdbc.Driver"  

  p:jdbcUrl="jdbc:mysql://127.0.0.1:3306/pinyougoudb?characterEncoding=utf8"  

  p:user="root"  

  p:password="123456" />

class="org.jasig.cas.authentication.handler.DefaultPasswordEncoder"  

c:encodingAlgorithm="MD5"  

p:characterEncoding="UTF-8" />  

  class="org.jasig.cas.adaptors.jdbc.QueryDatabaseAuthenticationHandler"  

  p:dataSource-ref="dataSource"  

  p:sql="select password from tb_user where username = ?"  

  p:passwordEncoder-ref="passwordEncoder"/>  

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

 

        

                           

                

                

            

              

        

            

        

其中

 

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

添加下面这一句配置

将以下四个jar包放入webapps\cas\WEB-INF\lib下  

单点登录_第6张图片

 

(这三个jar包在资源\cas\jar目录下

jar包的连接:https://pan.baidu.com/s/1qvkvjuE6bwEsXoJiHQR1HQ

用数据库中的用户名和密码进行测试

 

 

2.服务端(cas servers)

1.创建连个client端

创建一个工作空间

单点登录_第7张图片

分别创建两个maven项目,比如shop1和shop2

导入cas-client 的maven的坐标

1)搭建工程引入依赖

创建Maven工程 (war)casclient_demo1  引入cas客户端依赖并制定tomcat运行端口为9001

<dependencies>

  

<dependency>  

    <groupId>org.jasig.cas.clientgroupId>  

    <artifactId>cas-client-coreartifactId>  

    <version>3.3.3version>  

dependency>  

<dependency>

<groupId>javax.servletgroupId>

<artifactId>servlet-apiartifactId>

<version>2.5version>  

<scope>providedscope>

dependency>

dependencies>  

  <build>  

  <plugins>

      <plugin>  

          <groupId>org.apache.maven.pluginsgroupId>  

          <artifactId>maven-compiler-pluginartifactId>  

          <version>2.3.2version>  

          <configuration>  

              <source>1.7source>  

              <target>1.7target>  

          configuration>  

      plugin>  

      <plugin>

<groupId>org.apache.tomcat.mavengroupId>

<artifactId>tomcat7-maven-pluginartifactId>

<configuration>

<port>9001port>

<path>/path>

configuration>

     plugin>

  plugins>  

    build>

(2)添加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.SingleSignOutHttpSessionListenerlistener-class>  

    listener>  

      

    <filter>  

        <filter-name>CAS Single Sign Out Filterfilter-name>  

       <filter-class>org.jasig.cas.client.session.SingleSignOutFilterfilter-class>  

    filter>  

    <filter-mapping>  

        <filter-name>CAS Single Sign Out Filterfilter-name>  

        <url-pattern>/*url-pattern>  

    filter-mapping>  

      

    <filter>  

        <filter-name>CASFilterfilter-name>       <filter-class>org.jasig.cas.client.authentication.AuthenticationFilterfilter-class>  

        <init-param>  

            <param-name>casServerLoginUrlparam-name>  

            <param-value>http://localhost:9100/cas/loginparam-value>  

              

        init-param>  

        <init-param>  

            <param-name>serverNameparam-name>  

            <param-value>http://localhost:9001param-value>

        init-param>  

    filter>  

    <filter-mapping>  

        <filter-name>CASFilterfilter-name>  

        <url-pattern>/*url-pattern>  

    filter-mapping>  

      

    <filter>  

        <filter-name>CAS Validation Filterfilter-name>  

        <filter-class>     org.jasig.cas.client.validation.Cas20ProxyReceivingTicketValidationFilterfilter-class>  

        <init-param>  

            <param-name>casServerUrlPrefixparam-name>  

            <param-value>http://localhost:9100/casparam-value>  

        init-param>  

        <init-param>  

            <param-name>serverNameparam-name>  

            <param-value>http://localhost:9001param-value>

        init-param>  

    filter>  

    <filter-mapping>  

        <filter-name>CAS Validation Filterfilter-name>  

        <url-pattern>/*url-pattern>  

    filter-mapping>  

      

    <filter>  

        <filter-name>CAS HttpServletRequest Wrapper Filterfilter-name>  

        <filter-class>  

            org.jasig.cas.client.util.HttpServletRequestWrapperFilterfilter-class>  

    filter>  

    <filter-mapping>  

        <filter-name>CAS HttpServletRequest Wrapper Filterfilter-name>  

        <url-pattern>/*url-pattern>  

    filter-mapping>  

      

    <filter>  

        <filter-name>CAS Assertion Thread Local Filterfilter-name>       <filter-class>org.jasig.cas.client.util.AssertionThreadLocalFilterfilter-class>  

    filter>  

    <filter-mapping>  

        <filter-name>CAS Assertion Thread Local Filterfilter-name>  

        <url-pattern>/*url-pattern>  

    filter-mapping>  

web-app>

(3)编写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>商城1title>

head>

<body>

商城1.。。。。

<%=request.getRemoteUser()%>

body>

html>

request.getRemoteUser()为获取远程登录名

 

案例连接: 

 

 

参考:链接:https://www.jianshu.com/p/cf2879762f24  

 

你可能感兴趣的:(java,技术工具,java知识)