【Java】实现单点登录系统sso(Single Sign On)

sso是在多个应用系统中,用户只需要登录一次,就可以访问相互信任的应用系统。它可以将这次的登录信息装填映射到其他应用中,应用于用户的登录。

使用到的技术:

  1. mybatis
  2. springmvc
  3. spring
  4. Jedis

用户登录接口:

  1. 接受用户名和密码
  2. 校验用户名和密码
  3. 校验成功生成token,使用UUID
  4. 将用户信息存入redis,key即为token
  5. 将token存入cookie
  6. 返回登陆成功将token返回到客户端

主要的地方就是将数据存入redis部分。用redis模拟session,实现多个服务器共享session进而实现单点登录。

存入redis核心代码:

//生成token
		String token = UUID.randomUUID().toString();
		//把用户信息写入redis
		//key:REDIS_SESSION:{TOKEN}
		//value:user转json
		user.setPassword(null);
		jedisClient.set(REDIS_SESSION_KEY + ":" + token, JsonUtils.objectToJson(user));
		//设置session的过期时间
		jedisClient.expire(REDIS_SESSION_KEY + ":" + token, SESSION_EXPIRE);
		//写cookie
		CookieUtils.setCookie(request, response, "TT_TOKEN", token);

使用token取用户信息核心代码:

// 根据token取用户信息
		String json = jedisClient.get(REDIS_SESSION_KEY + ":" + token);
		//判断是否查询到结果
		if (StringUtils.isBlank(json)) {
			return TaotaoResult.build(400, "用户session已经过期");
		}
		//把json转换成java对象
		TbUser user = JsonUtils.jsonToPojo(json, TbUser.class);
		//更新session的过期时间  
		jedisClient.expire(REDIS_SESSION_KEY + ":" + token, SESSION_EXPIRE);

接着实现登录拦截:

  1. 先从cookie中取tooken TT_TOKEN;
  2. 如果tooken为空,则返回到登录页面,否则执行3;
  3. 根据tooken去redis中取用户信息;
  4. 如果rsession已过期,则转到登录页面,否则放行。

实现登录回调(在登录成功后返回拦截器拦截的请求中的那个url):

我们在登录的那个url中加上一个参数即回调的url。登陆成功后如果url不为null转到这个url,否则转到主页。

在配置拦截器时,如果用户未登录,我们重定向到登录页面,在重定向的那个url中,将当前拦截的这个请求所请求的url设为参数,即登录成功后要回到的页面。

扫描二维码关注公众号,回复: 3881314 查看本文章

猜你喜欢

转载自blog.csdn.net/baidu_29894819/article/details/79802686