当前位置: 首页 > article >正文

单点登录原理和JWT实现

一、单点登录效果

  首先我们看通过一个具体的案例来加深对单点登录的理解。案例地址:https://gitee.com/xuxueli0323/xxl-sso?_from=gitee_search 把案例代码直接导入到IDEA中

image.png

  然后分别修改下server和samples中的配置信息

image.png

image.png

在host文件中配置

127.0.0.1 sso.server.com
127.0.0.1 client1.com
127.0.0.1 client2.com

然后分别启动server和两个simple服务。

image.png

访问测试:

image.png

其中一个节点登录成功后其他节点就可以访问了

image.png

二、单点登录实现

  清楚了单点登录的效果后,我们就可以自己来创建一个单点登录的实现了。来加深下单点登录的理解了。

1.创建项目

  通过Maven创建一个聚合工程,然后在工程中创建3个子模块,分别为认证服务和客户端模块。

image.png

引入相同的依赖

image.png

2.client1

  我们先在client1中来提供相关的接口。我们提供一个匿名访问的接口和一个需要认证才能访问的接口。

@Controller
public class UserController {
   

    @ResponseBody
    @GetMapping("/hello")
    public String hello(){
   
        return "hello";
    }

    @GetMapping("/queryUser")
    public String queryUser(Model model){
   
        model.addAttribute("list", Arrays.asList("张三","李四","王五"));
        return "user";
    }
}

user.html中的代码为:

<!DOCTYPE html>
<html lang="en" xmlns:th="http://www.thymeleaf.org">
<head>
  <meta charset="UTF-8">
  <title>$Title$</title>
</head>
<body>
  <h1>用户管理:</h1>
    <ul>
      <li th:each="user:${list}">
        [[${user}]]
      </li>
    </ul>
</body>
</html>

访问测试:

image.png

没有认证就能访问,所以得加上验证的逻辑。

    @GetMapping("/queryUser")
    public String queryUser(Model model, HttpSession session){
   
        Object userLogin = session.getAttribute("userLogin");
        if(userLogin != null){
   
            // 说明登录过了,直接放过
            model.addAttribute("list", Arrays.asList("张三","李四","王五"));
            return "user";
        }
        // 说明没有登录,需要跳转到认证服务器认证  为了能在登录成功后跳回到当前页面,传递参数
        return "redirect:http://sso.server:8080/loginPage?redirect=http://client1.com:8081/queryUser";
    }

可以看到当我们访问queryUser请求的时候,因为没有登录所以会重定向到认证服务中的服务,做登录处理。这时就需要进入到server服务中处理

3.server服务

  在服务端我们需要提供两个接口,一个调整到登录界面,一个处理认证逻辑以及一个登录页面


@Controller
public class LoginController {
   

    /**
     * 跳转到登录界面的逻辑
     * @return
     */
    @GetMapping("/loginPage")
    public String loginPage(@RequestParam(value = "redirect" ,required = false) String url, Model model){
   
        model.addAttribute("url",url);
        return "login";
    }

    /**
     * 处理登录请求
     * @return
     */
    @PostMapping("/ssoLogin")
    public String login(@RequestParam("userName") String userName,
                        @RequestParam("password") String password,
                        @RequestParam(value = "url",required = false) String url){
   
        if("zhangsan".equals(userName) && "123".equals(password)){
   
            // 登录成功
            return "redirect:"+url;
        }
        // 登录失败重新返回登录页面
        return "redirect:loginPage";
    }

}

登录页面代码逻辑

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

http://www.kler.cn/a/568274.html

相关文章:

  • C++蓝桥杯基础篇(六)
  • vim:基础配置
  • Linux--输入输出重定向、父进程与子进程的继承关系
  • 如何管理路由器
  • 金融赋能绍兴纺织 民生银行助力外贸中小微企业“走出去”
  • 新一代跨境电商ERP系统:从订单到发货的全流程自动化管理
  • windows下适用msvc编译ffmpeg 适用于ffmpeg-7.1
  • php 的 composer.phar 是干什么用的?
  • Vue3实现文件上传、下载及预览全流程详解(含完整接口调用)
  • 加油站小程序实战教程03站点管理
  • 《从0到1:用Python在鸿蒙系统开发安防图像分类AI功能》
  • Ubuntu 下 nginx-1.24.0 源码分析 - ngx_pstrdup函数
  • 计算机视觉(opencv-python)入门之图像的读取,显示,与保存
  • 【每日八股】MySQL篇(三):索引(上)
  • 如何让 Git 管理本地项目
  • 基于PHP+MySQL实现的毕业设计选题管理系统
  • 算法(四)——位运算与位图
  • Unity中动态切换光照贴图的方法
  • Android限制后台服务、广播和Activity,节省更多的电量
  • MAC 怎么设置 Java虚拟内存设置