SSO 系统分析、SSO工程搭建、单点登录接口文档分析及Service层接口开发并发布、单点登录检查数据是否可用-Controller层及测试

SSO 系统分析

一、什么是SSO系统?
SSO英文全称Single Sign On,单点登录。SSO是在多个应用系统中,用户只需要登录一次就可以访问所有相互信任的应用系统。它包括可以将这次主要的登录映射到其他应用中用于同一个用户的登录的机制。它是目前比较流行的企业业务整合的解决方案之一。

二、为什么要有单点登录系统?
2.1 传统的登录实现方式
登陆后—》session《—访问别的页面
这种登录方式对只有一个web工程的情况下是没有问题的,但是对于分布式系统来说,由于牵扯到多个系统,如果每访问一个系统都要输入一遍用户名、密码的话那将非常麻烦,也是用户所不能忍受的,这时单点登录便派上用场了。

2.2 集群模式下的登录方式
用户—》负载均衡服务器nginx—〉1.访问用户中心要求用户登陆(tomcat1. webapp[session User1])
—》2.刷新页面,要求用户再次登陆(tomcat2. webapp[session User1])

集群和分布式的区别在于,集群是多台设备干同一件事情,而分布式是不同的设备干不同的事情。传统模式的工程当用户访问量大的时候就难以招架了,这时首先考虑到的是使用集群来增加网站的吞吐量,一个tomcat可以处理大约300个并发,多个tomcat就可以处理更多的并发。但是tomcat集群有一个致命的瓶颈,那就是session共享,由于不同的tomcat之间要以广播的方式来进行session共享,当tomcat数量较多时,广播便占据了绝大多数带宽,从而使真正的请求难以被处理,一般来说,tomcat集群中tomcat的个数不要超过5个。

2.3 集群与分布式架构
用户—》负载均衡服务器nginx—〉1.访问用户中心要求用户登陆(tomcat1. webapp[session User1])
—》2.刷新页面,要求用户再次登陆(tomcat2. webapp[session User1])
—》登陆处理 session服务器(SSO系统)登陆页面【Session User1】. ---->Redis服务器

与单纯的集群相比,把登录单独拿出来,可以使用Session服务器,保存Session信息,使每个节点是无状态。需要模拟Session。单点登录系统是使用redis模拟Session,实现Session的统一管理。登录独立的好处便是解决了session共享的问题,这样集群便可以几乎不受限制的进行扩展。

SSO工程搭建

首先,我们还是再看一下淘淘商城的系统架构,到目前为止,我们已经做了后台管理系统、商城门户、搜索系统、商品服务、内容服务、搜索服务、缓存redis、Solr服务、索引库、消息队列ActiveMQ。还未实现的部分是会员系统、订单系统、单点登录服务、订单服务、持久层。我们这节要搭建的工程便是会员系统和单点登录服务。
SSO 系统分析、SSO工程搭建、单点登录接口文档分析及Service层接口开发并发布、单点登录检查数据是否可用-Controller层及测试

下面我们便开始搭建工程,首先来搭建单点登录服务系统taotao-sso,这个工程是个pom(聚合)工程,包含两个子模块,taotao-sso-interface、taotao-sso-service。

File----->New------>Other------>Maven------->Maven Project------->勾选"Create a simple project (skip archetype selection)“之后便看到如下图所示界面。填完相应信息后点击"Finish”。

修改taotao-sso工程的pom.xml文件,添加对taotao-common的依赖以及配置tomcat插件(大家可以参考taotao-manager工程的pom.xml文件)tomcat端口号为8087

下面新建taotao-sso聚合工程的两个子工程,首先新建taotao-sso-interface工程,包方式默认就是jar,我们不用动 修改taotao-sso-interface工程的pom.xml文件,添加如下图所示依赖。

下面我们新建taotao-sso-service工程,它也是一个模块,打包方式中选择"war", 修改taotao-sso-service工程的pom.xml文件,添加一些依赖,修改后的pom.xml文件
下面把taotao-manager-service工程的src/main/resources目录下的文件拷贝过来,mybatis目录下的SqlMapConfig.xml文件不用修改
properties目录下的db.properties文件我们也不用修改
resource.properties文件内容我们清空就可以了
下面看spring目录下的applicationContext-dao.xml文件的内容也不用动。
spring目录下的applicationContext-jedis.xml文件我们也原封不动的留着
既然要保留jedis的配置文件就需要把相关包和类拷贝过来,我们参考taotao-content-interface和taotao-content-service工程,将taotao-content-interface工程下的"com.taotao.jedis.service"包以及包下的JedisClient.java类拷贝到taotao-sso-interface工程的src/main/java目录下
接着把taotao-content-service工程下的src/main/java目录下的"com.taotao.jedis.service.impl"包以及包下的两个类复制到taotao-sso-service工程的src/main/java目录下
下面修改applicationContext-service.xml,如下图所示,在taotao-sso-interface工程下新建扫描包"com.taotao.sso.service",在taotao-sso-service工程下新建"com.taotao.sso.service.impl"。发布的dubbo服务名称修改为"taotao-sso",dubbo服务的端口修改为"20883"。
下面修改applicationContext-trans.xml,只需要修改切面。
下面我们拷贝taotao-content-service工程下的WEB-INF目录及web.xml文件,修改下

下面我们再创建一个表现层工程,taotao-sso-web
修改taotao-sso-web工程的pom.xml文件
将taotao-item-web工程的src/main/resources目录下的资源文件拷贝到taotao-sso-web工程的src/main/resources目录下,resource目录下的resource.properties文件我们清空它
下面修改springmvc.xml文件
最后添加web.xml文件,如下图所示。将taotao-item-web替换为taotao-sso-web
这样,SSO工程便搭建完了。

单点登录接口文档分析及Service层接口开发并发布

在工作当中,开发文档是我们开发人员最重要的开发指南, 对开发文档一定要认真研读,不可错过任何重要信息,我们现在学单点登录(SSO)也需要学习下开发文档。

我们先来看文档的第一个接口(注册接口):检查数据是否可用,如下图所示。文档中明确给出请求的类型是GET请求,URL地址也给我们规定好了,http://sso.taotao.com是域名,user/check/代表检查用户合法性。{param}/{type}是指要检查的参数及类型,param是可选参数,可以分别代表username、phone、email,当param代表username时type的值传1,当param代表phone时type的值传2,当param代表email时type的值传3。可选参数callback可以用于支持跨域解决js请求的问题。返回值参数都给我定好了,status代表状态码,msg代表返回的消息,data代表用户所传参数是否可用。我们最常用的TaotaoResult便刚好满足返回值的条件。

SSO 系统分析、SSO工程搭建、单点登录接口文档分析及Service层接口开发并发布、单点登录检查数据是否可用-Controller层及测试
http请求肯定是在客户端写的,而客户端是需要服务端接口支撑的,现在我们便实现服务层接口开发及发布服务。

首先来看下数据来源,我们所要检查的用户数据都存储在tb_user表中,我们检查一下用户名、电话、邮箱是否合法,如果在用户表中已经有了,那么就非法,如果用户表中没有相同记录,那么就合法。由于是单表操作,因此我们使用逆向工程生成的dao层代码即可。

我们在接口类中添加接口TaotaoResult checkUserData(String data,int type);

之后在taotao-sso-service工程中添加实现类UserServiceImpl

下面我们便发布一下服务,如下图所示。暴露的服务接口类<dubbo:service interface=“com.taotao.sso.service.UserService” ref=“userServiceImpl” timeout=“300000”/>
这样Service层便写完了。

单点登录检查数据是否可用—Controller层及测试

首先我们要确保taotao-sso-web工程依赖了taotao-sso-interface工程以及是否依赖了jackson相关包(用来将对象转为json的),查看"Maven Dependencies"下的包,如果有taotao-sso-interface以及下图圈住的三个jackson包说明已经依赖好了。如果没有则要添加对它的依赖。

下面我们添加对dubbo服务的引用(<dubbo:reference interface=“com.taotao.sso.service.UserService” id=“userService” />)

下面我们新建一个Controller类,

下面我们来测试一下这个接口是否好用。

在测试之前,我们要先把taotao-sso-service工程下的spring目录下的applicationContext-Activemq.xml文件给删除掉(当时建工程的时候我忘记删了),否则会影响工程启动,去掉那个文件之后,spring目录下就只剩下四个配置文件了

先将taotao-sso工程打包到本地maven仓库,方法就是在taotao-sso工程上右键------>Run As------->Maven install

下面我们便依次启动taotao-sso-service和taotao-sso-web工程,用tomcat插件启动工程前面多次说到了,就是在工程上右键------>Run As------>Maven Build,然后就会看到如下图所示对话框,我们在Goals一栏输入"clean tomcat7:run"然后点击"Apply"之后再点击"Run"这样taotao-sso-service工程便开始启动了,同理我们启动taotao-sso-web工程。

启动好之后,我们在地址栏中输入http://localhost:8088/user/check/zhangsan/1,可惜的是,我们会看到如下图所示的错误(这里之所以没有事先把错误都排查掉是为了和大家一起学习下如何解决问题)

404错误是找不到对应的接口,也就是我们的访问请求并没有被拦截,这是由于taotao-sso-web工程的web.xml文件配置过滤条件造成的,如下图所示,可以看到当前配置的拦截请求是以"*.html"结尾的,

那么我们不妨在请求地址的最后加上.html结尾,如http://localhost:8088/user/check/zhangsan/1.html所示,404问题虽然没了,但出来个406错误,出现406错误与SpringMVC框架有关,我们在请求的末尾加上.html后,SpringMVC便把请求返回的结果当做html页面来渲染,但是我们返回的是TaotaoResult对象,它本身是无法被渲染成html的,因此就会抛出406的错误。可见,我们在请求的结尾加.html是不可行的。

不能在结尾加.html还有更重要的一个原因,那就是接口文档,在接口文档中明确给出了请求的格式,如下图所示,可以看到并没有以.html结尾,我们作为开发人员不能擅自在请求后面加.html。

那么,我们应该怎样解决问题呢?其实也很简单,那就是将web.xml文件的过滤条件改为"/"

下面重启taotao-sso-web工程,然后访问http://localhost:8088/user/check/zhangsan/1,可以看到如下图所示结果。data返回false说明zhangsan这个用户名已经被别人注册过了。

把用户名修改为"zhangsan11",如下图所示,可以看到这个用户名还没有被注册。

我们再测试下电话,我们在数据库中复制一个已经注册过的电话
我们在地址栏输入http://localhost:8088/user/check/13333333333/2,如下图所示。可以看到该手机号已经被注册了。
随便修改下手机号,然后再测试一下,如下图所示。可以看到这个手机号没有被注册过。

下面我们再测试下邮箱是否合法,可以看到"aa@a"这个邮箱已经被注册过了。
我们修改下邮箱,再试试,如下图所示,可以看到这个邮箱没有被注册过。

上一篇:单点登录原理与简单实现【转载】


下一篇:什么是单点登录