sso系统使用
一:什么是sso(single sign on) ?
sso(单点登录系统)简单说就是客户端第一次访问应用1的时候,由于没有登录,会被引导到登录页面进行登录,如果登录校验通过,将返回一个认证信息ticket,作为认证凭据。下次客户端访问应用2的时候,发送的url请求会携带着ticket作为自己的认证凭据,服务器会将该请求携带的ticket交给认证中心进行比对,检验,如果检验通过,应用2在可以不登录的情况下访问内部的资源信息。
二:单点登录系统的整个登录过程
(1)传统登录方式(单应用下)
图一:为传统的登录方式。在一个工程下这套登录机制是没有问题的。但是集群环境下会出现要求用户多次登录的情况
如何解决集群环境中用户多次登录的情况?
解决多次登录的方案有两种:就是解决session共享的问题
1.配置tomcat集群,在tomcat中配置session共享(session复制),但是问题是tomcat部署的节点过多,会出现性能问题。所以一般不适用这种方式
2.可以使用session服务器,是每个节点保持无状态,保存session信息。模拟session。
单点登录就是为了解决session共享问题提出的一套解决方案。使用redis模拟session,实现session的统一管理。
(2)使用单点登录的业务流程
登录流程解析:
第一步:第一次访问,进入登录系统输入用户名密码进行验证登录,如果登录成功,生成Token对象,作为认证令牌(token相当于原来的jsessionid字符串,这里使用uuid)
第二步:将返回的token对象信息存入redis服务器。key 就是token , value就是登录用户的信息
第三步:既然是模拟session,所以也需要设置key的过期时间。
第四步:将token(存储的key)写入cookie中,作为用户请求的url参数信息
第五步:用户第二次访问,首先检查用户是否登录,将写入cookie中的token作为请求参数,服务器会从url中解析token的值,然后将解析的token值作为key查询redis服务器;如果查询结果为空,表示session已经过期,要求客户端跳转到登录页面完成登录操作;如果查询结果不为空,需要将查询的信息(登录用户的信息)作为对象返回,然后重新设置key的过期时间。
第六步:解决跨域的问题,使用js发送ajax请求, 使用jsonp解决跨域问题。需要服务器返回的数据格式为mycallback:{id:xx,name:xx},所以将返回的json数据进行拼接成要求的格式即可。
三:登录过程的核心代码
@Override
public E3Result login(String username, String password) {
try {
TbUserExample example = new TbUserExample();
Criteria criteria = example.createCriteria();
criteria.andUsernameEqualTo(username);
List<TbUser> list = userMapper.selectByExample(example);
if (list == null || list.size() == 0) {
// 登录失败
return E3Result.build(400, "用户名或密码错误");
}
//获得用户对象
TbUser user = list.get(0);
//校验用户密码
if(!(user.getPassword()).equals(DigestUtils.md5Hex(password.getBytes()))) {
//校验失败
return E3Result.build(400, "用户名或者密码错误");
} //登录成功
//1.创建token对象,使用uuid
String token = UUID.randomUUID().toString();
//2.将uuid作为key,用户信息作为value值存入redis中
jedisClient.set("USER_INFO:"+token, JsonUtils.objectToJson(user));
//3.设置过期时间,半小时
jedisClient.expire("USER_INFO:"+token, 1800); //4.返回登录成功的信息 return E3Result.ok(token); } catch (Exception e) {
e.printStackTrace();
} return null;
}
解决跨域问题的服务端
@RequestMapping(value = "/user/token/{token}", produces = MediaType.APPLICATION_JSON_VALUE)
@ResponseBody
public String getTokenName(@PathVariable String token, String callback) {
E3Result result = tokenService.getToken(token);
if (StringUtils.isNotBlank(callback)) {
// 拼接成页面需要的数据给事
// mycall({id:1,name:z});
String json = callback + "(" + JsonUtils.objectToJson(result) + ");";
System.out.println(json);
return json;
}
return JsonUtils.objectToJson(result);
}
客户端代码:
var E3MALL = {
checkLogin : function(){
//COOKIE_TOKEN_KEY设置的cookie的name值
var _ticket = $.cookie("COOKIE_TOKEN_KEY");
if(!_ticket){
return ;
}
$.ajax({
url : "http://localhost:8088/user/token/" + _ticket,
dataType : "jsonp",
type : "GET",
success : function(data){
if(data.status == 200){
var username = data.data.username; var html = username + ",欢迎!<a href=\"http://www.e3mall.cn/user/logout.html\" class=\"link-logout\">[退出]</a>";
$("#loginbar").html(html);
}
}
});
}
} $(function(){
// 查看是否已经登录,如果已经登录查询登录信息
E3MALL.checkLogin();
});
sso系统使用的更多相关文章
- C#.NET 大型企业信息化系统 - 防黑客攻击 - SSO系统加固优化经验分享
好久没写文章了,突然间也不知道写什么好了一样,好多人可能以为我死了,写个文章分享一下.证明一下自己还在,很好的活着吧,刷个存在感. 放弃了很多娱乐.休闲.旅游.写文章.看书.陪伴家人,静心默默的用了接 ...
- SSO系统的分析与架构
随着公司子系统越来越多,一直以来使用ucenter的同步登录方式的性能以及效率问题显得越来越大,重新构建一个SSO系统显得势在必行. 通过google搜索关于SSO单点登录文章,发现以下文章关于新浪微 ...
- SSO系统的实现
当一个网站系统比较大型的时候,我们通常采用面向服务的编程,采用分布式的编程.各个子系统共同来实现一个大的系统,这时候登录注册功能的实现也面临着一些问题. 一.WHAT? SSO是什么? sso是单点登 ...
- OpenSAML2.X 在SSO系统中的应用
背景 年底的时候有机会开发一个SPA(单页面应用)的项目,那时候须要用到票据的方式能够用Cookie的方式来登录.当是想到了OpenID或者是CAS的方式来做统一认证中心.后来一个安全界的大牛推荐让我 ...
- e3mall商城总结11之sso系统的分析、应用以及解决ajax跨域问题
说在前面的话 一.sso系统分析 什么是sso系统 SSO英文全称Single Sign On,单点登录.SSO是在多个应用系统中,用户只需要登录一次就可以访问所有相互信任的应用系统.它包括可以将这次 ...
- SpringCloud微服务实战——搭建企业级开发框架(四十):使用Spring Security OAuth2实现单点登录(SSO)系统
一.单点登录SSO介绍 目前每家企业或者平台都存在不止一套系统,由于历史原因每套系统采购于不同厂商,所以系统间都是相互独立的,都有自己的用户鉴权认证体系,当用户进行登录系统时,不得不记住每套系统的 ...
- 单点登录--sso系统
SSO英文全称Single Sign On,单点登录.SSO是在多个应用系统中,用户只需要登录一次就可以访问所有相互信任的应用系统.它包括可以将这次主要的登录映射到其他应用中用于同一个用户的登录的机制 ...
- sso系统登录以及jsonp原理
登录的处理流程: 1.登录页面提交用户名密码. 2.登录成功后生成token.Token相当于原来的jsessionid,字符串,可以使用uuid. 3.把用户信息保存到redis.Key就是toke ...
- 单点登录(SSO)系统的总结
前些天一位其他开发部门的同事找到我们了解一些关于SSO单点登录的事,他们要做单点登录,同时也需要和我们这边的系统做集成,要我帮忙做一单点登录,了解关于单点登录的解决方案和资料,虽然做单点登录已经很久了 ...
随机推荐
- EBS 客户表结构
客户表/联系人/PARTY关联 HZ_PARTIES 客户账户表 HZ_CUST_ACCOUNTS SELECT hp.party_number --客户注册标识 , hp.party_name ...
- 最简单的基于FFmpeg的libswscale的示例附件:测试图片生成工具
===================================================== 最简单的基于FFmpeg的libswscale的示例系列文章列表: 最简单的基于FFmpeg ...
- Android官方推荐使用DialogFragment替换AlertDialog
DialogFragment是在Android3.0(API level 11)中引入的,它代替了已经不建议使用的AlertDialog. DialogFragment高效地封装和管理对话框的生命周期 ...
- Java并发——线程池原理
"池"技术对我们来说是非常熟悉的一个概念,它的引入是为了在某些场景下提高系统某些关键节点性能,最典型的例子就是数据库连接池,JDBC是一种服务供应接口(SPI),具体的数据库连接实 ...
- [Android游戏开发学习笔记]View和SurfaceView
本文为阅读http://blog.csdn.net/xiaominghimi/article/details/6089594的笔记. 在Android游戏中充当主要角色的,除了控制类就是显示类.而在A ...
- 精通CSS+DIV网页样式与布局--页面背景
上篇博客,我们主要简单的总结了CSS的图片效果,我们这回来讲讲CSS如何对网页的背景进行设置,网页的背景是整个网页的重要组成部分,她直接决定了整个网页的风格和色调.这篇博客简单的总结一下如何用CSS来 ...
- 【Unity技巧】自定义消息框(弹出框)
写在前面 这一篇我个人认为还是很常用的,一开始也是实习的时候学到的,所以我觉得实习真的是一个快速学习工程技巧的途径. 提醒:这篇教程比较复杂,如果你不熟悉NGUI.iTween.C#的回调函数机制,那 ...
- 《java入门第一季》之有趣的集合小案例---获取10个【1-20之间】的随机数,要求不能重复。
import java.util.ArrayList; import java.util.Random; /* * 获取10个[1-20之间]的随机数,要求不能重复.(注意:不是获取10个数,如果单纯 ...
- 海量数据挖掘MMDS week6: MapReduce算法(进阶)
http://blog.csdn.net/pipisorry/article/details/49445519 海量数据挖掘Mining Massive Datasets(MMDs) -Jure Le ...
- Spring boot之hello word
环境准备 一个称手的IDE(首选Myeclipse,也可以选Eclipse) Java环境(JDK 1.7或以上版本) Maven 3.0+(Eclipse和Idea IntelliJ内置,如果使用I ...