1. 程式人生 > 實用技巧 >直觀簡單講解單點登入的流程原理

直觀簡單講解單點登入的流程原理

1、程式碼部分

1.1認證中心程式碼:

1.1.1Controller

@Controller
public class LoginController {

    /**
     * 當你的redis資料庫裡面本來存的是字串資料或者你要存取的資料就是字串型別資料的時候,那麼你就使用StringRedisTemplate即可,
     * 但是如果你的資料是複雜的物件型別,而取出的時候又不想做任何的資料轉換,直接從Redis裡面取出一個物件,那麼使用RedisTemplate是
     */
    @Autowired
    StringRedisTemplate redisTemplate;

    @GetMapping(
"/login.html") public String Login(@RequestParam(value = "redirect_url",required = false) String url, Model model, @CookieValue(value ="sso_token",required = false) String sso_token){ if (!StringUtils.isEmpty(sso_token)){ return "redirect:"+url+"?token="+sso_token; }
else { model.addAttribute("url",url); return "login"; } } @PostMapping("/doLogin") public String doLogin(String username, String password, String url, HttpServletResponse response){ if (username!=null&&password!=null){ //登陸成功後跳回之前頁面
//把登入成功的使用者存起來 String uuid = UUID.randomUUID().toString().replace("-",""); redisTemplate.opsForValue().set(uuid,username); Cookie sso_token = new Cookie("sso_token",uuid); response.addCookie(sso_token); //用token作為辨別是否已登入 return "redirect:"+url+"?token="+uuid; } return "login"; } }

1.1.2前端程式碼

<!DOCTYPE html>
<html lang="en" xmlns:th="http://www.thymeleaf.org">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
<form action="/doLogin" method="post">
    賬號:<input name="username"><br/>
    密碼:<input name="password" type="password"><br/>
    <input type="hidden" name="url" th:value="${url}">
    <input type="submit" value="登入"/>
</form>
</body>
</html>

1.2客戶端1程式碼

1.2.1客戶端1Controller

@Controller
public class HelloController {

    @Value("${sso.server.url}")
    String ssoServer;


    @GetMapping("/employees")
    public String employees(Model model, HttpSession session, @RequestParam(value = "token", required = false) String token) {


        Object loginUser = session.getAttribute("loginUser");
        //TODO 1、去ssoserver獲取當前token真正對應的使用者資訊
        if (token != null && loginUser != null ) {
            List<String> emps = new ArrayList<>();
            emps.add("張三");
            emps.add("李四");

            model.addAttribute("emps", emps);
            return "list";
        } else {
            session.setAttribute("loginUser", "zhangsan");
            return "redirect:" + ssoServer + "?redirect_url=http://clientone.com:8081/employees";
        }

    }
}

1.2.2前端程式碼

<!DOCTYPE html>
<html lang="en" xmlns:th="http://www.thymeleaf.org">
<head>
    <meta charset="UTF-8">
    <title>員工列表</title>
</head>
<body>

<h1>
    歡迎:[]
</h1>
<ul>
    <li th:each="emp:${emps}">姓名是:[[${emp}]]</li>
</ul>
</body>
</html>

1.2.3配置檔案

server.port=8081

sso.server.url = http://sso.com:8080/login.html

spring.redis.host=192.168.111.131

1.3客戶端2程式碼

1.3.1客戶端2Controller

@Controller
public class HelloController {

    @Value("${sso.server.url}")
    String ssoServer;


    @GetMapping("/boss")
    public String employees(Model model, HttpSession session, @RequestParam(value = "token", required = false) String token) {

        Object loginUser = session.getAttribute("loginUser");
        //TODO 1、去ssoserver獲取當前token真正對應的使用者資訊
        if (token != null && loginUser != null) {
            List<String> emps = new ArrayList<>();
            emps.add("張三");
            emps.add("李四");
            model.addAttribute("emps", emps);
            return "list";
        } else {
            session.setAttribute("loginUser", "zhangsan");
            return "redirect:" + ssoServer + "?redirect_url=http://clientone.com:8082/boss";
        }
    }
}

前端程式碼和客戶端1一樣,配置檔案更改server.port=8082即可

2、流程圖部分