✅P235_商城业务-认证服务-单点登录流程-3
查询用户信息
认证中心编写接口查询用户信息
cfmall-test-sso-server/src/main/java/com/gyz/cfmall/controller/LoginController.java
@GetMapping("/userInfo")
@ResponseBody
public String userInfo(@RequestParam("token") String token) {
String info = redisTemplate.opsForValue().get(token);
return info;
}
客户端去认证中心查询用户信息
cfmall-test-sso-client/src/main/java/com/gyz/cfmall/controller/HelloController.java#employees
@GetMapping("/employees")
public String employees(Model model, HttpSession session, @RequestParam(value = "token", required = false) String token) {
if (!StringUtils.isEmpty(token)) {
//去认证中心查询用户信息
RestTemplate restTemplate = new RestTemplate();
ResponseEntity<String> entity = restTemplate.getForEntity("http://ssoserver.com:8082/userInfo?token=" + token, String.class);
String body = entity.getBody();
session.setAttribute("loginUser", body);
}
Object loginUser = session.getAttribute("loginUser");
if (loginUser == null) {
return "redirect:" + SSOServerUrl + "?redirect_url=http://client1.com:8083/employees";
} else {
List<Object> emps = new ArrayList<>();
emps.add("zhangsan");
emps.add("lisi");
model.addAttribute("emps", emps);
return "employees";
}
}
创建cfmall-test-sso-client2
复制cfmall-test-sso-client服务,并修改端口、服务名等信息
cfmall-test-sso-client2/src/main/resources/application.properties
server.port=8084
cfmall-test-sso-client2/src/main/java/com/gyz/cfmall/controller/HelloController.java
@GetMapping("/boss")
public String employees(Model model, HttpSession session, @RequestParam(value = "token", required = false) String token) {
if (!StringUtils.isEmpty(token)) {
//去认证中心查询用户信息
RestTemplate restTemplate = new RestTemplate();
ResponseEntity<String> entity = restTemplate.getForEntity("http://ssoserver.com:8082/userInfo?token=" + token, String.class);
String body = entity.getBody();
session.setAttribute("loginUser", body);
}
Object loginUser = session.getAttribute("loginUser");
if (loginUser == null) {
return "redirect:" + SSOServerUrl + "?redirect_url=http://client2.com:8084/boss";
} else {
List<Object> emps = new ArrayList<>();
emps.add("zhangsan");
emps.add("lisi");
model.addAttribute("emps", emps);
return "employees";
}
}
实现一次登录,核心就是认证通过之后给浏览器留下一个痕迹,凡是访问ssoserver.com这个域名的都会带上这个痕迹,通过使用cookie实现
cfmall-test-sso-server/src/main/java/com/gyz/cfmall/controller/LoginController.java#doLogin
/**
* 处理登录请求
*
* @return
*/
@PostMapping("/doLogin")
public String doLogin(@RequestParam("username") String username,
@RequestParam("password") String password,
@RequestParam("redirect_url") String url,
HttpServletResponse response) {
if (!StringUtils.isEmpty(username) && !StringUtils.isEmpty(password)) {
String uuid = UUID.randomUUID().toString().replace("-", "");
redisTemplate.opsForValue().set(uuid, username);
Cookie ssoToken = new Cookie("sso_token", uuid);
response.addCookie(ssoToken);
return "redirect:" + url + "?token=" + uuid;
}
return "login";
}
@GetMapping("/login.html")
public String loginPage(@RequestParam("redirect_url") String url, Model model,
@CookieValue(value = "sso_token", required = false) String sso_token) {
if (!StringUtils.isEmpty(sso_token)) {
return "redirect:" + url + "?token=" + sso_token;
}
model.addAttribute("url", url);
return "login";
}
cfmall-test-sso-client2/src/main/resources/templates/employees.html
<h1>欢迎:[[${session.loginUser}]]</h1>
测试
测试前先清除cookie等历史数据;
请求 http://localhost:8083/employees,未登录直接跳转到 http://ssoserver.com:8082/login.html 登录界面,用户名密码随意填写,登陆完成重定向到
http://ssoserver.com:8082/login.html?redirect_url=http://localhost:8083/employees,展示数据;
请求 http://localhost:8084/boss 同样得流程,如果client1登录成功,那么client2不用登录,直接刷新页面即可获取数据;