前言
本文借鉴学习了团团大佬的文章和源码
原文地址
想知道单点登录原理等理论可以移步大佬文章
代码及实现
本次学习基于session模拟了数据库查询和token权限认证
构建
准备三个服务器,这里用三个springboot项目直接模拟了,他们三个端口不一样
oa : springboot模拟的子系统 端口 8082
ekp: springboot模拟的子系统 端口 8083
index : springboot模拟的主系统 端口 8080
login : springboot模拟的sso认证系统 端口 8081
代码实现
在登录的时候,如果登录成功则将登录信息生成 一个token,将他存入session。(模拟存入数据库或redis)然后每次访问其他子系统的时候就带着这个token(相当于登录信息)。进入子系统的时候会检查token的真实性。实现单点登录
//这里token模拟了权限认证框架的认证信息
下面是login,模拟sso认证的控制层
@GetMapping("/login")
public String login(@RequestParam(value = "target",required = false,defaultValue = "http://localhost:8080/") String target, HttpSession session){
// 获取网址前缀
session.setAttribute("target",target);
return "login";
}
@PostMapping("/check")
public String checkUser(User user, HttpSession session, HttpServletResponse response){
// 拿到网址
String target = session.getAttribute("target").toString();
String token = "";
//模拟数据库验证
if(user.getUsername().equals("admin") && user.getPassword().equals("123456")) {
//模拟一个token 因为目前没用域名,所以直接把token拼接在url上面了
token = UUID.randomUUID().toString();
// Cookie cookie = new Cookie("token",token);
// cookie.setDomain("baidu.com");
// response.addCookie(cookie);
return "redirect:" + target +"?token="+token;
}else {
session.setAttribute("msg","登录失败,请检查用户名和密码后重试!");
return "login";
}
}
这里将token存入了session,页面上访问其他子系统的时候会在url后面拼接这个token。
最后进入系统的时候会检查,token的正确性并放行
//这是三个系统(oa ,ekp,index)的控制层都是一样的
package com.index.controller;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.thymeleaf.util.StringUtils;
import javax.servlet.http.HttpSession;
@Controller
public class IndexController {
@GetMapping
public String index(@RequestParam(value = "token", required = false) String token, HttpSession session) {
//模拟token验证
if (!StringUtils.isEmpty(token)) {
session.setAttribute("username", "admin");
session.setAttribute("token", token);
}
return "index";
}
//退出登录
@GetMapping("/out")
public String out(HttpSession session) {
session.removeAttribute("username");
// 这里用session模拟从redis中删除token(权限认证信息)
session.removeAttribute("token");
return "redirect:" + "http://localhost:8080/";
}
}
总结
学会了单点登录原理,有机会会尝试使用到自己的项目中。
有不懂可以观摩大佬源码
这是团团大佬的gitee源码地址