单点登陆入门小Demo

 上一张学习了单点登陆这种思想以及部署了一个单点登录项目,地址:https://blog.csdn.net/luo609630199/article/details/82717492

那么接下来我们将会做一个单点登录的小案例,让大家更加直观的感受单点登录这种思想.

那么接下来我们就会创建两个工程

 1.5 CAS客户端入门小Demo

 1.5.1客户端工程1搭建

(1)搭建工程引入依赖

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

<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.tomcat.maven</groupId>
            <artifactId>tomcat7-maven-plugin</artifactId>
            <configuration>
                <!-- 指定端口 -->
                <port>9001</port>
                <!-- 请求路径 -->
                <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.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:8087/cas/login</param-value>
            <!--这里的server是服务端的IP -->
        </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>

    <!-- 该过滤器负责对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:8087/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>
    <!-- ======================== 单点登录结束 ======================== -->

</web-app>


(3)编写index.jsp 

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>cas入门案例1</title>
</head>
<body>
欢迎进入cas课程内容,<%= request.getRemoteUser() %>
</body>
</html>


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

 1.5.2客户端工程2搭建(同工程1一样)

(1)创建Maven工程 (webapp)casclient_demo2  引入cas客户端依赖并制定tomcat运行端口为9002

(2)创建web.xml,参照casclient_demo1  ,将serverName的值改为http://localhost:9002,一共两处

(3)创建index.jsp  ,内容显示“欢迎进入cas课程内容2”

 1.5.3单点登录测试

 

  1. 启动cas部署的tomcat 
  2. 启动客户端工程1和客户端工程2
  3. 地址栏输入http://localhost:9001/   和http://localhost:9002/  ,地址均会跳转到CAS登录页
  4. 输入用户名和密码后,页面跳转回9002  ,再次访问9001也可以打开主页面。

 1.5.4单点退出登录

地址栏输入  http://localhost:8087/cas/logout

即可看到退出后的提示页面

然后当再次刷新上面两个网页时你会发现都活跳到登录页面

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

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

但我们更希望退出登录后,能自动跳转到某个页面,那如何处理呢?

修改cas系统的配置文件WEB-INF/cas-servlet.xml

  <bean id="logoutAction" class="org.jasig.cas.web.flow.LogoutAction"

        p:servicesManager-ref="servicesManager"

        p:followServiceRedirects="${cas.logout.followServiceRedirects:true}"/>

改为true后,可以在退出时跳转页面到目标页面,修改index.jsp的退出链接

<a href="http://localhost:8087/cas/logout?service=http://www.baidu.com">退出登录</a>

 2.CAS服务端数据源设置

 2.1需求分析

上面我们登录的密码和账号都是我们自己配置的,而实际项目中是需要从数据库读取的,我们现在让用户名密码从我们的数据库的user表里做验证

 2.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://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"/>

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

<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" /> -->
            <!-- 使用我们刚才自定义的认证管理器 -->
           
<entry key-ref="dbAuthHandler" value-ref="primaryPrincipalResolver" />
        </map>
    </constructor-arg>
    <property name="authenticationPolicy">
        <bean class="org.jasig.cas.authentication.AnyAuthenticationPolicy" />
    </property>
</bean>

(3)将以下三个jar包放入webapps\cas\WEB-INF\lib下 

(这三个jar包如果没有请到网上下载)

用数据库中的用户名和密码进行测试(如果测试成功那就大功告成啦!)

 

 

猜你喜欢

转载自blog.csdn.net/luo609630199/article/details/82724609