sso单点登录原理与简单实现

2019-06-15  本文已影响0人  kk_a108

一、单点登录概念理解

        在多个应用系统,或者是分布式系统中,用户只需要登录一次,再访问其他系统,就不需要再次登录,自动登录。

二、单点登录实现原理

        要实现单点登录,主要需要解决两个问题:1.session共享,2.ajax跨域问题。可以将用户身份信息存储在第三方单点登录认证服务器,可以使用cas单点登录框架实现,cas共享用户身份信息,cookie存储用户身份信息唯一标识(所以要实现单点登录,浏览器不能禁用cookie),cas的协议过程如下图:

三、使用cas实现单点登录

        1.下载cas服务端cas-server-webapp-4.0.0.war ,将其改名为 cas.war 部署到 tomcat 目录下的 webapps 下,浏览器输入 http://localhost:8080/cas/login,即可看到登录页面:

    2.cas客户端搭建,可以搭建两个或两个以上的客户端项目进行测试,搭建参考下面

        (1)搭建maven工程引入cas相关依赖

<dependencies>

<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>

(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:8080/cas/login</param-value>

<!--这里的 server 是cas服务端的 IP 和端口,根据所部属的服务端的ip端口做相应修改-->

</init-param>

<init-param>

<param-name>serverName</param-name>

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

<!--这里的 是cas客户端项目的 访问地址,根据项目做相应修改-->

</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:8080/cas</param-value>

</init-param>

<init-param>

<param-name>serverName</param-name>

<param-value>http://localhost:9091</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.单点登录测试

        (1)启动cas服务端

        (2)启动客户端工程1和客户端工程2

        (3)在浏览器分别访问两个客户端项目,均会跳转到cas登录页面,输入用户名密码,访问其中一个客户端项目后,再访问另一个客户端项目,不需要再进行登录,单点登录实现。

        4.以上测试的登录页面是cas自带的登录页面,可改为自己项目的登录页面,同时可配置用户名和密码从数据库中读取,具体实现可参考其他资料,这里不再叙述。

上一篇下一篇

猜你喜欢

热点阅读