• 单点登录cas-4.0.0 只是简单的同时登入,同时登出功能


    什么是单点登录

    单点登录(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服务器验证票据通过后,传输用户认证结果信息给客户端。

    CAS服务端部署

    Cas服务端其实就是一个war包。
    在资源cassourcecas-server-4.0.0-releasecas-server-4.0.0modules目录下
    cas-server-webapp-4.0.0.war 将其改名为cas.war放入tomcat目录下的webapps下。启动tomcat自动解压war包。浏览器输入http://localhost:8080/cas/login ,可看到登录页面

    cas下载链接:https://pan.baidu.com/s/1Domy7fuej2OnAbkcM-RMHQ 密码:70n5

    不要嫌弃这个页面丑,我们后期可以再提升它的颜值。暂时把注意力放在功能实现上。 这里有个固定的用户名和密码 casuser/Mellon登录成功后会跳到登录成功的提示页面

     

    cas启动完毕!!!

    第二步

    修改tomcat端口,也可以不修改

     修改CAS配置文件 修改cas的WEB-INF/cas.properties

    去除https认证

    CAS默认使用的是HTTPS协议,如果对安全要求不高,可使用HTTP协议。我们这里讲解通过修改配置,让CAS使用HTTP协议。

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

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

    这里需要增加参数p:requireSecure=”false”,requireSecure属性意思为是否需要安全验证,即HTTPS,false为不采用 

    修改cas的/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" />

    参数p:cookieSecure=”true”,同理为HTTPS验证相关,TRUE为采用HTTPS验证,FALSE为不采用https验证。
    参数p:cookieMaxAge=”-1”,是COOKIE的最大生命周期,-1为无生命周期,即只在当前打开的窗口有效,关闭或重新打开其它窗口,仍会要求验证。可以根据需要修改为大于0的数字,比如3600等,意思是在3600秒内,打开任意窗口,都不需要验证。
    我们这里将cookieSecure改为false , cookieMaxAge 改为3600


    修改cas的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" />


    我们这里将cookieSecure改为false , cookieMaxAge 改为3600

    ===================================================

    现在来新建maven项目,cas,创建过程,请浏览这篇 eclipse创建maven项目 随想,现在maven的pom.xml文件中添加jar包依赖

    <!-- cas -->
    <dependency>
      <groupId>org.jasig.cas.client</groupId>
      <artifactId>cas-client-core</artifactId>
      <version>3.3.3</version>
      <exclusions>
        <exclusion>
          <groupId>org.slf4j</groupId>
          <artifactId>log4j-over-slf4j</artifactId>
        </exclusion>
      </exclusions>
    </dependency>

    配置web.xml

    <!-- 该过滤器用于实现单点登出功能,可选配置。 -->
    <filter>
    <filter-name>CAS Single Sign Out Filter</filter-name>
    <filter-class>org.jasig.cas.client.session.SingleSignOutFilter</filter-class>
    </filter>
    <!-- 该过滤器负责用户的认证工作,必须启用它 -->
    <filter>
    <filter-name>CASFilter</filter-name>
    <filter-class>org.jasig.cas.client.authentication.AuthenticationFilter</filter-class>
    <init-param>
    <param-name>casServerLoginUrl</param-name>

    <!--此处会跳转到cas单点登录的登录页面
    <param-value>http://localhost:38080/cas/login</param-value>
    <!--这里的server是服务端的IP -->
    </init-param>
    <init-param>
    <param-name>serverName</param-name>

    <!--成功后跳转的ip-->

    <param-value>http://localhost:8080</param-value>
    </init-param>
    </filter>
    <!-- 该过滤器负责对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:38080/cas</param-value>
    </init-param>
    <init-param>
    <param-name>serverName</param-name>
    <param-value>http://localhost:8080</param-value>
    </init-param>
    </filter>

    <!-- 该过滤器负责实现HttpServletRequest请求的包裹, 比如允许开发者通过HttpServletRequest的getRemoteUser()方法获得SSO登录用户的登录名,可选配置。 -->
    <filter>
    <filter-name>CAS HttpServletRequest Wrapper Filter</filter-name>
    <filter-class>
    org.jasig.cas.client.util.HttpServletRequestWrapperFilter</filter-class>
    </filter>

    <!-- 该过滤器使得开发者可以通过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 Single Sign Out Filter</filter-name>
    <url-pattern>/*</url-pattern>
    </filter-mapping>
    <filter-mapping>
    <filter-name>CASFilter</filter-name>
    <url-pattern>/*</url-pattern>
    </filter-mapping>
    <filter-mapping>
    <filter-name>CAS Validation Filter</filter-name>
    <url-pattern>/*</url-pattern>
    </filter-mapping>
    <filter-mapping>
    <filter-name>CAS HttpServletRequest Wrapper Filter</filter-name>
    <url-pattern>/*</url-pattern>
    </filter-mapping>
    <filter-mapping>
    <filter-name>CAS Assertion Thread Local Filter</filter-name>
    <url-pattern>/*</url-pattern>
    </filter-mapping>
    <!-- 用于单点退出,该过滤器用于实现单点登出功能,可选配置 -->
    <listener>
    <listener-class>org.jasig.cas.client.session.SingleSignOutHttpSessionListener</listener-class>
    </listener>

    配置完成后,启动maven项目,会跳转至cas的登录页面

    登录成功后跳转至maven的欢迎界面http://localhost:38080/cas/login?service=http%3A%2F%2Flocalhost%3A8081%2Fcas1%2F

    service后面的ip和port取自于web.xml配置文件,service后面的地址也是登录后转发的地址。

     新建第二个maven项目,创建过程与上一样,pom.xml文件添加jar包依赖,web.xml文件添加单点登录配置

    ,两个项目用同一个tomcat启动,也可以用两个tomcat启动,然后访问第一个项目,登录成功后,访问第二个项目的时候,就不需要再次登录,会直接跳转到第二个项目的欢迎界面,可以看到输出下面内容,到这里,单点登录已经成功

    我们可以将这个链接添加到index.jsp中

    <a href="http://localhost:38080/cas/logout">退出登录</a>

     但我们更希望退出登录后,能自动跳转到某个页面,那如何处理呢? 
    修改cas系统的配置文件cas-servlet.xml

    <bean id="logoutAction" class="org.jasig.cas.web.flow.LogoutAction"
    p:servicesManager-ref="servicesManager"
    p:followServiceRedirects="${cas.logout.followServiceRedirects:true}"/>

    <a href="http://localhost:38080/cas/logout?service=http://localhost:38080/cas/login?service=http://localhost:8080/cas1/index.jsp">退出登录</a>

    如果这样的a标签会ticket验证不过去,<a href="http://localhost:38080/cas/logout?service=http://localhost:8080/cas1">退出登录</a>

    升级单点登录----单点登录页面改造,单点登录验证改成匹配数据库,动态验证

    修改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/pinyougoudb?characterEncoding=utf8"
    p:user="root"
    p:password="123456" />
    <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"/> 

    引入 jar包依赖

    将以下三个jar包放入webappscasWEB-INFlib下

     

    用数据库中的用户名和密码进行测试,到这里最简单的单点登录就算完成了,但是扩展就得看源码。

    今天突然感觉很无奈,感觉读源码能力需要去培养一下,目前是能力为0.

  • 相关阅读:
    Java Web学习笔记之---EL和JSTL
    Java Web学习笔记之---Servlet
    Java Web项目案例之---登录注册和增删改查(jsp+servlet)
    Java项目案例之---加法计算器(转发和重定向)
    Java Web项目案例之---登录和修改(JSP)
    Java Web学习笔记之---JSP
    Java项目案例之---定时器的使用
    Java项目案例之---常用工具类练习
    Java学习笔记之---API的应用
    这些年我对安全成熟度模型的一点点思考
  • 原文地址:https://www.cnblogs.com/hejj-bk/p/11308651.html
Copyright © 2020-2023  润新知