SSO是在多个应用系统中,用户只需要登录一次就可以访问所有相互信任的应用系统。它包括可以将这次主要的登录映射到其他应用中用于同一个用户的登录的机制。它是目前比较流行的企业业务整合的解决方案之一。
实现单点登录系统,提供服务接口。把session数据存放在redis。
1、单点登录系统流程
image.png2、实现流程
2.1、用户注册
/**
*用户注册
*/
public TaotaoResult createUser(TbUser user) {
user.setUpdated(new Date());
user.setCreated(new Date());
//md5加密
user.setPassword(DigestUtils.md5DigestAsHex(user.getPassword().getBytes()));
userMapper.insert(user);
return TaotaoResult.ok();
}
2.2、用户登录
/**
* 用户登录
*/
@Override
public TaotaoResult userLogin(String username, String password) {
TbUserExample example = new TbUserExample();
Criteria criteria = example.createCriteria();
criteria.andUsernameEqualTo(username);
List<TbUser> list = userMapper.selectByExample(example);
//如果没有此用户名
if (null == list || list.size() == 0) {
return TaotaoResult.build(400, "用户名或密码错误");
}
TbUser user = list.get(0);
//比对密码
if (!DigestUtils.md5DigestAsHex(password.getBytes()).equals(user.getPassword())) {
return TaotaoResult.build(400, "用户名或密码错误");
}
//生成token
String token = UUID.randomUUID().toString();
//保存用户之前,把用户对象中的密码清空。
user.setPassword(null);
//把用户信息写入redis
jedisClient.set(REDIS_USER_SESSION_KEY + ":" + token, JsonUtils.objectToJson(user));
//设置session的过期时间
jedisClient.expire(REDIS_USER_SESSION_KEY + ":" + token, SSO_SESSION_EXPIRE);
//把REDIS_USER_SESSION_KEY + ":" + token存进浏览器的cookie中(wzf),这样用户登录相关的系统时,取得cookie中的值,然后在redis数据库中进行查询,如果结果存在,则表明用户已经登录。
//返回token
return TaotaoResult.ok(token);
}
2.3、通过token查询用户信息
根据token判断用户是否登录或者session是否过期。接收token,根据token到redis中取用户信息。判断token字符串是否对应用户信息,如果不对应说明token非法或者session已过期。取到了说明用户就是正常的登录状态。返回用户信息,同时重置用户的过期时间(用户处于活动状态)。
/**
*通过token判断session信息
*/
public TaotaoResult getUserByToken(String token) {
//根据token从redis中查询用户信息
String json = jedisClient.get(REDIS_USER_SESSION_KEY + ":" + token);
//判断是否为空
if (StringUtils.isBlank(json)) {
return TaotaoResult.build(400, "此session已经过期,请重新登录");
}
//更新过期时间
jedisClient.expire(REDIS_USER_SESSION_KEY + ":" + token, SSO_SESSION_EXPIRE);
//返回用户信息
return TaotaoResult.ok(JsonUtils.jsonToPojo(json, TbUser.class));
}
网友评论