✅P234_商城业务-认证服务-单点登录流程-2
2024/2/14大约 1 分钟
单点登录流程-2
编写一个隐藏的input框,用于存储调回的url
cfmall-test-sso-server/src/main/java/com/gyz/cfmall/controller/LoginController.java
package com.gyz.cfmall.controller;
import org.springframework.data.redis.core.StringRedisTemplate;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.util.StringUtils;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestParam;
import javax.annotation.Resource;
import java.util.UUID;
@Controller
public class LoginController {
@GetMapping("/login.html")
public String login(@RequestParam("redirect_url") String url, Model model) {
model.addAttribute("url", url);
return "login";
}
//代码省略...
}
cfmall-test-sso-server/src/main/resources/templates/login.html
<!DOCTYPE html>
<html lang="en" xmlns:th="http://www.thymeleaf.org">
<head>
<meta charset="UTF-8">
<title>欢迎登录</title>
</head>
<body>
<form action="/doLogin" method="post">
用户名 <input type="text" name="username"/><br/>
密 码 <input name="password" type="passWord"/><br/>
<input type="hidden" name="redirect_url" th:value="${url}"/>
<input type="submit" value="登录"/>
</form>
</body>
</html>
导入redis依赖
cfmall-test-sso-server/pom.xml
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>
配置redis信息
cfmall-test-sso-server/src/main/resources/application.properties
spring.redis.host=192.168.17.130
spring.redis.port=6379
登录成功保存用户信息并传递token
cfmall-test-sso-server/src/main/java/com/gyz/cfmall/controller/LoginController.java
package com.gyz.cfmall.controller;
import org.springframework.data.redis.core.StringRedisTemplate;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.util.StringUtils;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestParam;
import javax.annotation.Resource;
import java.util.UUID;
@Controller
public class LoginController {
@Autowired
private StringRedisTemplate redisTemplate;
//代码省略...
/**
* 处理登录请求
*
* @return
*/
@GetMapping("/doLogin")
public String doLogin(@RequestParam("username") String username,
@RequestParam("password") String password,
@RequestParam("redirect_url") String url) {
if (!StringUtils.isEmpty(username) && !StringUtils.isEmpty(password)) {
String uuid = UUID.randomUUID().toString().replace("-", "");
redisTemplate.opsForValue().set(uuid, username);
return "redirect:" + url + "?token=" + uuid;
}
return "login";
}
}
拿到令牌需要去认证中心查询用户的信息,这里只是简单保存了以下并没有模拟
cfmall-test-sso-client/src/main/java/com/gyz/cfmall/controller/HelloController.java
@GetMapping("/employees")
public String employees(Model model, HttpSession session, @RequestParam(value = "token", required = false) String token) {
if (!StringUtils.isEmpty(token)) {
//TODO:去认证中心查询用户信息
model.addAttribute("loginUser", "zhangsan");
}
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";
}
}