单点登录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://github.com/HailongAngel/SSO/commits?author=HailongAngel