单点登录SSO+redis(有免费源码,新手使用)

最近在学习单点登录,真的是要被搞疯,想找一个源码使用一下,都是收费的,气的我花了时间自己写了一个。

觉得不妥的下方评论咱们共同讨论。直接在后台操作,不用前台页面。

1.首先说一下我理解的单点登录,在一个大的业务中,有很多个系统,客户在浏览同一家公司的不同系统时,只需要登录一次就够了。
在这里插入图片描述

2.思路:进入自己想要访问的页面,系统会检查cookie里面是否存有用户的信息,有的话直接允许通过,cookie中没有信息的话转到登录页面验证用户信息,并且将token放到redis,增加cookie

3.直接准备Coding

//登录的处理流程

1、登录页面提交用户名密码。
2、登录成功后生成token。Token相当于原来的jsessionid,字符串,可以使用uuid。
3、把用户信息保存到redis。Key就是token,value就是用户信息
4、把token写入cookie中。
7、Cookie需要跨域。例如www.jd.com\sso.jd.com\order.jd.com,可以使用工具类。
8、Cookie的有效期。关闭浏览器失效。

请求的url:/user/login
请求的方法:POST
参数:
{
“username”:“zs”,
“password”:“123”
}
返回值:json数据

@PostMapping("login.do")
    public ServiceResponse Login(@RequestBody User user, HttpServletResponse response) throws Exception {
        ServiceResponse responseS = new ServiceResponse();
        //1.判断用户名和密码是否正确
        String username = user.getUsername();
        String password = user.getPassword();
        if (username == null || password == null) {
            responseS.setCode("1111");
            responseS.setMessage("用户名或者密码不能为空");
            return responseS;
        }
        User info = userService.LoginInfo(username);
        if (info == null) {
            responseS.setCode("1112");
            responseS.setMessage("用户信息不匹配");
            return responseS;
        }
        //2、登录成功后生成token。Token相当于原来的jsessionid。
             String token = UUID.randomUUID().toString();
        //获取ShardedJedis对象
            Jedis jedis = jedisPool.getResource();
            //存入键值对
            jedis.set(token,info.getUsername()+":"+info.getPassword());
            //设置key过期时间
          //  jedis.expire(token,60);
            //回收ShardedJedis实例
            jedis.close();
        if (info.getPassword() .equals(password) ) {
            RespUtil.setSuccessResp("登录成功",responseS,info);
        }
        //设置Cookie,并且使用AES算法进行加密
        String tokenEn = AesCBC.getInstance().encrypt(token,"utf-8",sKey,ivParameter);
        Cookie cookie = new Cookie("ssocookie",tokenEn);
        cookie.setPath("/");
        response.addCookie(cookie);
        return responseS;
    }

//检验的流程

@PostMapping("getUserByToken.do")
    public ServiceResponse getUserByToken(HttpServletRequest request) throws Exception {
        ServiceResponse responseS = new ServiceResponse();
        Cookie[] cookies = request.getCookies();
        //获取ShardedJedis对象
        Jedis jedis = jedisPool.getResource();
        //根据键值获得数据
        if (cookies != null){
            for (Cookie cookie :cookies
                    )
            {
                //将加密的token进行解密
                String tokende =AesCBC.getInstance().decrypt(cookie.getValue(),"utf-8",sKey,ivParameter);
                String result = jedis.get(tokende);
                if (result!=null){
                    jedis.close();
                    RespUtil.setSuccessResp("登录成功",responseS,result);
                    break;
                }

            }
            }
            return responseS;

    }
![在这里插入图片描述](https://img-blog.csdnimg.cn/20190804212423840.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzQxMTY2MTM1,size_16,color_FFFFFF,t_70)```
源码地址
https://github.com/HailongAngel/SSO/commits?author=HailongAngel