Bootstrap

SpringBoot实现基础的sso单点登录

前言

本文借鉴学习了团团大佬的文章和源码
原文地址
想知道单点登录原理等理论可以移步大佬文章

代码及实现

本次学习基于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源码地址


;