单点登入

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

在这里插入图片描述
实现思路:

  1. 当用户通过用户名和密码进行登录时,将数据提交给jt-web服务器.
  2. JT-WEB将接收的数据交给JT-SSO后台系统完成校验.
  3. JT-SSO利用username和password查询数据,如果数据正确,表示用户信息正确.将user对象转化为json串.同时生成全球独一无二的秘钥TICKET.保存到redis中.
  4. JT-SSO将生成的ticket返回给jt-web服务器.
  5. JT-WEB服务器将TICKET数据保存到客户端的Cookie中,同时实现数据的共享!!!.

单点登入中Redis缓存机制:Redis的数据结构是K:V的键值对,K是保存TICKET秘钥也就是后台动态生成唯一标识的加密秘钥,而V中存放的是对应的已脱敏(不存放用户重要的隐私信息)后的用户信息的json串。

单点登入中数据共享的实现:当用户登入后成功后,用户在访问其他相关的系统时,发出的请求链接会携带cookie中的TICKET秘钥,系统会在Redis缓存中查询知否存在该秘钥,以及该秘钥的用户信息串,如果存在,则放行,允许用户访问在相关系统,如果没有的话,则跳转到登入页面。

登录业务类代码

@Service
public class DubboUserServiceImpl implements DubboUserService{
	@Autowired
	private UserMapper userMapper;
	@Autowired
	private JedisCluster jedisCluster;
	@Override
	
	
	/**
	 * 1.根据用户名和密码查询数据库
	 * 不正确的话返回null
	 * 2.生成ticket(加密秘钥)UserJOSN串,将数据保存到redis中
	 * 3.返回ticket
	 */
	@Override
	public String doLogin(User user) {
		User userDB = getUserDB(user);
		if(userDB==null) {
			return null;
		}
		
		//生成秘钥
		String uuid = UUID.randomUUID().toString();
		String ticket = DigestUtils.md5DigestAsHex(uuid.getBytes());
		userDB.setPassword("*******");
		//将对象转换成json串
		String userJSON= ObjectMapperUtil.toJSON(userDB);
		//保存到Redis中
		jedisCluster.setex(ticket, 7*60*60, userJSON);
		return ticket;
	}
	
	public User getUserDB(User user) {
		String md5password = DigestUtils.md5DigestAsHex(user.getPassword().getBytes());
		user.setPassword(md5password);
		Wrapper<User> queryWrapper = new QueryWrapper<>(user);
		// TODO Auto-generated method stub
		User userDB = userMapper.selectOne(queryWrapper );
		return userDB;
	}
}


对象与Json串转换工具类代码

public class ObjectMapperUtil {
	private static final ObjectMapper MAPPER = new ObjectMapper();
	/*
	 * 将对象转换成json字符串
	 */
	public static String toJSON( Object target) {
		String result = null;
		try {
			 result = MAPPER.writeValueAsString(target);
		} catch (JsonProcessingException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		return result;
	}
	
	/*
	 * 将json串转成对象
	 */
	public static <T> T toObject(String json,Class<T> target){
		T object =null;
		try {
			object = MAPPER.readValue(json, target);
		} catch (Exception e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		return object;
	}
}

细心的可能会有个疑问,万一cookie中TICKET是被人伪造的呢?
为了防止出现这种情况,只能采用补救措施,增加身份认证,比如IP地址认证,手机验证码认证,邮箱激活链接认证,手机端还有人脸认证等

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值