文章目录

一.什么是单点登录

单点登录(Single Sign On),简称为 SSO,是目前比较流行的企业业务整合的解决方案之一。SSO的定义是在多个应用系统中,用户只需要登录一次就可以访问所有相互信任的应用系统。

我们目前的系统存在诸多子系统,而这些子系统是分别部署在不同的服务器中,那么使用传统方式的session是无法解决的,我们需要使用相关的单点登录技术来解决。

单点登录和CAS解决方案入门_客户端

二.自己可以搭建个单点登录可以吗?

可以的,自己可以搭建个简单的单点登录系统(即sso服务)。
思路:

  • sso服务提供登录功能
  • sso服务登录成功将用户信息保存到redis,然后将redis用户信息的key放在cookie中
  • 别的系统登录的时候,添加拦截器,如果redis中没有key对应的用户则跳到sso服务的登录页面
  • 其他系统登录注意跨域请求问题,sso登录成功要能够返回到原来的系统页面。
    可以参考淘淘商城的sso单点登录功能实现方式。
  • 关键代码块:
    loginController
  • 单点登录和CAS解决方案入门_单点登录_02


  • 单点登录和CAS解决方案入门_单点登录_03

  • 其他系统的拦截器loginInterceptor
  • 单点登录和CAS解决方案入门_服务端_04

优缺点或者注意

  • 需要解决跨域问题
  • 需要解决动态扩展

三.CAS解决方案和原理

总结就2句话:
1.先认证,每次请求拿ticket到cas服务端,cas服务端根据ticket给出用户信息
2.ticket都是保存到cookie中的,只要在一个电脑的浏览器上操作,这个ticket就可以保存到本地,第一次没有ticket,但是给用户信息获取ticket,第一次以后都是用ticket换取用户信息。

1)CAS服务端如何部署

单点登录和CAS解决方案入门_服务端_05


单点登录和CAS解决方案入门_服务端_06

2)如何修改端口

单点登录和CAS解决方案入门_CAS_07

3)如何去除http认证

单点登录和CAS解决方案入门_单点登录_08


单点登录和CAS解决方案入门_CAS_09


单点登录和CAS解决方案入门_服务端_10


单点登录和CAS解决方案入门_客户端_11


单点登录和CAS解决方案入门_服务端_12

4.客户端用最简单方法怎么调用服务端

1)客户端工程1搭建

​https://github.com/hufanglei/pinyou/tree/casclient-demo1​

2)客户端工程2搭建

​https://github.com/hufanglei/pinyou/tree/casclient-demmo2​

关键代码:
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:9100/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:9100/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>

pom.xml

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

总结:CAS客户端主要是预设了几个过滤器,在客户端指定上cas服务的地址,指定登录成功后的地址,和登录退出地址,就可以了

3)单点登录测试

5.单点登录退出如何在服务端和客户端设置

1)服务端

单点登录和CAS解决方案入门_CAS_13

2)客户端

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

6.服务端如何配置数据源

(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"/>

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

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

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

单点登录和CAS解决方案入门_服务端_14


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

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

7.如何修改登录页

1)修改登录页

思路:

  • 将自己的登陆页login.html拷贝到cas系统下WEB-INF\view\jsp\default\ui 目录下
  • 将css js等文件夹拷贝到 cas目录下
  • 将原来的casLoginView.jsp 改名(可以为之后的修改操作做参照),将login.html改名为casLoginView.jsp
    -
  • 单点登录和CAS解决方案入门_单点登录_15


  • 单点登录和CAS解决方案入门_CAS_16

  • (4)修改密码框
  • 单点登录和CAS解决方案入门_服务端_17

2)修改错误提示

在表单内加入错误提示框

单点登录和CAS解决方案入门_服务端_18


单点登录和CAS解决方案入门_服务端_19