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

简介: 单点登录和CAS解决方案入门

一.什么是单点登录


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


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

1dc618a0ed9580ce8bfa6facb208c08f.png


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


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

思路:


sso服务提供登录功能

sso服务登录成功将用户信息保存到redis,然后将redis用户信息的key放在cookie中

别的系统登录的时候,添加拦截器,如果redis中没有key对应的用户则跳到sso服务的登录页面

其他系统登录注意跨域请求问题,sso登录成功要能够返回到原来的系统页面。

可以参考淘淘商城的sso单点登录功能实现方式。

关键代码块:

loginController

1dc618a0ed9580ce8bfa6facb208c08f.png5d4c6812c8535adbb050f4ddf2e1bce8.png


其他系统的拦截器loginInterceptor

46a9d80a6e05e4e3b19d57a0ee70bcdf.png


优缺点或者注意


需要解决跨域问题

需要解决动态扩展


三.CAS解决方案和原理


https://blog.csdn.net/ban_tang/article/details/80015946

总结就2句话:


1.先认证,每次请求拿ticket到cas服务端,cas服务端根据ticket给出用户信息


2.ticket都是保存到cookie中的,只要在一个电脑的浏览器上操作,这个ticket就可以保存到本地,第一次没有ticket,但是给用户信息获取ticket,第一次以后都是用ticket换取用户信息。


1)CAS服务端如何部署


1dc618a0ed9580ce8bfa6facb208c08f.png

5d4c6812c8535adbb050f4ddf2e1bce8.png


2)如何修改端口


46a9d80a6e05e4e3b19d57a0ee70bcdf.png


3)如何去除http认证


1dc618a0ed9580ce8bfa6facb208c08f.png

5d4c6812c8535adbb050f4ddf2e1bce8.png

46a9d80a6e05e4e3b19d57a0ee70bcdf.png


66ba272a0bfc97be54a5fa679e3d5482.png


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)服务端


1dc618a0ed9580ce8bfa6facb208c08f.png

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下

5d4c6812c8535adbb050f4ddf2e1bce8.png

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

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


7.如何修改登录页


1)修改登录页


思路:


将自己的登陆页login.html拷贝到cas系统下WEB-INF\view\jsp\default\ui 目录下

将css js等文件夹拷贝到 cas目录下

将原来的casLoginView.jsp 改名(可以为之后的修改操作做参照),将login.html改名为casLoginView.jsp

-

1dc618a0ed9580ce8bfa6facb208c08f.png5d4c6812c8535adbb050f4ddf2e1bce8.png46a9d80a6e05e4e3b19d57a0ee70bcdf.png

(4)修改密码框


2)修改错误提示


在表单内加入错误提示框


1dc618a0ed9580ce8bfa6facb208c08f.png5d4c6812c8535adbb050f4ddf2e1bce8.png




相关文章
|
2月前
|
NoSQL Redis
SSO单点登录核心原理
SSO单点登录核心原理
86 0
|
存储 安全 Java
【SSO-CAS部署】安装部署单点登录组件CAS(5.3.x版本)
【SSO-CAS部署】安装部署单点登录组件CAS(5.3.x版本)
701 0
【SSO-CAS部署】安装部署单点登录组件CAS(5.3.x版本)
|
存储 NoSQL 安全
JavaWeb - SSO单点登录原理之基于CAS(一)
JavaWeb - SSO单点登录原理之基于CAS(一)
228 0
|
缓存 网络安全
JavaWeb - SSO单点登录原理之基于CAS(二)
JavaWeb - SSO单点登录原理之基于CAS(二)
229 0
JavaWeb - SSO单点登录原理之基于CAS(二)
|
Java 应用服务中间件
CAS单点登陆原理简介及环境搭建(3)
CAS单点登陆原理简介及环境搭建(3)
128 0
CAS单点登陆原理简介及环境搭建(3)
|
应用服务中间件 数据库
CAS单点登陆原理简介及环境搭建(2)
CAS单点登陆原理简介及环境搭建(2)
155 0
CAS单点登陆原理简介及环境搭建(2)
|
应用服务中间件 数据安全/隐私保护
CAS单点登陆原理简介及环境搭建(1)
CAS单点登陆原理简介及环境搭建(1)
198 0
CAS单点登陆原理简介及环境搭建(1)
|
存储 安全 Java
单点登录的原理
单点登录的原理
279 0
|
存储 JavaScript 前端开发
单点登录原理及其实现方案
单点登录(Single sign-on,简称 SSO),一种对于许多相互关连,但是又是各自独立的软件系统,提供访问控制的属性。 当拥有该属性时,当用户登录时,就可以获取所有系统的访问权限,不用对每个单一系统都逐一登录。所以你会看到很多域名直接是sso.domain.com,也就是用来做单点登录。
271 0
单点登录原理及其实现方案
|
Java 数据安全/隐私保护
单点登录终极方案之 CAS 应用及原理
Cookie的单点登录的实现方式很简单,但是也问题颇多。例如:用户名密码不停传送,增加了被盗号的可能。另外,不能跨域!
单点登录终极方案之 CAS 应用及原理