首页 > 其他分享 >单点登录 XXL sso-client sso-server

单点登录 XXL sso-client sso-server

时间:2023-05-22 22:32:29浏览次数:35  
标签:return String url token server sso client public

单点登录

  • 一处登陆 处处使用

环境配置

gulimall-test-sso-client
gulimall-test-sso-server
127.0.0.1 ssoserver.com
127.0.0.1 client1.com
127.0.0.1 client2.com

gulimall-test-sso-server 中设置登陆

@GetMapping("/login.html")
public String loginPage(@RequestParam("redirect_url") String url, Model model){
    model.addAttribute("url",url);
    return "login";
}

<form action="/doLogin" method="post">
   用户名:<input type="text" name="username" /><br />
   密码:<input type="password" name="password" /><br />
   <input type="hidden" name="url" th:value="${url}"/><br />
   <input type="submit" value="登录">
</form>

当登陆成功过
@PostMapping(value = "/doLogin")
public String doLogin(String username,String password,String url) {
    if (!StringUtils.isEmpty(username)&&StringUtils.isEmpty(password)){
        //登录成功跳转,跳回到登录页
        return "redirect:"+url;
    }
    //登陆失败
    return "login";
}

报错无法跳转回去 
String uuid = UUID.randomUUID().toString().replace("_", "");
redisTemplate.opsForValue().set(uuid, username);
//登录成功跳转,跳回到登录页 并携带一个令牌uuid 返回出去
return "redirect:" + url + "?token=" + uuid;

在客户端中

// ssoserver登陆成功 之后 带回的token 不一定是会带回来的 设置required = false
public String employees(Model model, HttpSession session,
                        @RequestParam(value = "token", required = false) String token) {
    if (!StringUtils.isEmpty(token)) {
        // todo 去ssoserver 获取当前token对应用户真正信息
        session.setAttribute("loginUser", "张三");
    }
}

gulimall-test-sso-client

@GetMapping("/login.html")
public String loginPage(@RequestParam("redirect_url") String url, Model model) {
    model.addAttribute("url", url);
    return "login";
}

@PostMapping(value = "/doLogin")
public String doLogin(@RequestParam("username") String username, @RequestParam("password") String password,
                      @RequestParam("url") String url) {
    if (!StringUtils.isEmpty(username) && !StringUtils.isEmpty(password)) {
        //redis 中保存
        String uuid = UUID.randomUUID().toString().replace("_", "");
        redisTemplate.opsForValue().set(uuid, username);
        //登录成功跳转,跳回到登录页 并携带一个令牌uuid 返回出去
        return "redirect:" + url + "?token=" + uuid;
    }
    //登陆失败
    return "login";
}

client1 登陆成功了 如果还有client2呢 解决方案 第二个系统不需要登录 复制一份client1 server 在一个客户端 登录之后 并没有记住 登陆过 所以第二个登录了 依旧跳转登录界面 所以给浏览器 留一个令牌(token)

//server 服务器

public String doLogin(@RequestParam("url") String url,HttpServletResponse response) {               
Cookie cookie = new Cookie("sso_token",uuid);
//设置cookie
response.addCookie(cookie);
return "redirect:" + url + "?token=" + uuid;
---
}

登陆成功重定向和保存cookie 浏览器要给ssoserver.com斯名下保存一个cookie; 浏览器以后访问这个域名都要蒂上发个域名下的所有cookie

//客户端client2 登录 @CookieValue 取出cookie(不一定存在required = false)

@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)){
        ///说明之前有人登录过,浏览器留下了痕迹 又重定向到 请求页面 并且 携带tocken
        return "redirect:" + url + "?token=" + sso_token;
    }
    model.addAttribute("url", url);
    return "login";
}
登录跳转成功之后 创建直接token

server

@Controller
public class LoginController {

    @Autowired
    StringRedisTemplate redisTemplate;

    @ResponseBody
    @GetMapping("userInfo")
    public String userInfo(@RequestParam("token") String token){
        String s = redisTemplate.opsForValue().get(token);
        return s;

    }


    @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";
    }

    @PostMapping(value = "/doLogin")
    public String doLogin(@RequestParam("username") String username,
                          @RequestParam("password") String password,
                          @RequestParam("url") String url,
                          HttpServletResponse response) {
        if (!StringUtils.isEmpty(username) && !StringUtils.isEmpty(password)) {
            //redis 中保存
            String uuid = UUID.randomUUID().toString().replace("_", "");
            redisTemplate.opsForValue().set(uuid, username);
            //登录成功跳转,跳回到登录页 并携带一个令牌uuid 返回出去
            Cookie cookie = new Cookie("sso_token",uuid);
            response.addCookie(cookie);
            return "redirect:" + url + "?token=" + uuid;
        }
        //登陆失败
        return "login";
    }
}

client1

@Controller
public class HelloController {
    @Value("${sso.server.url}")
    String ssoServerUrl;
    @ResponseBody
    @GetMapping(value = "/hello")
    public String hello() {
        return "hello";
    }
    @GetMapping(value = "/employees")
    // ssoserver登陆成功 之后 带回的token 不一定是会带回来的 设置required = false
    public String employees(Model model, HttpSession session,
                            @RequestParam(value = "token", required = false) String token) {
        if (!StringUtils.isEmpty(token)) {
            RestTemplate restTemplate = new RestTemplate();
            ResponseEntity<String> forEntity =
                    restTemplate.getForEntity("http://ssoserver.com:8080/userInfo?token=" + token, String.class);
            String body = forEntity.getBody();
            // todo 去ssoserver 获取当前token对应用户真正信息
            session.setAttribute("loginUser", body);
        }

        Object loginUser = session.getAttribute("loginUser");

        if (loginUser == null) {
            //没登录,跳转到服务器登录  重定向到 新地址 并携带之前地址
            //╱跳转过去以后,使用url上的查询参数标识我们自己是哪个页面
            return "redirect:" + ssoServerUrl + "?redirect_url=http://client1.com:8081/employees";
        } else {
            List<String> emps = new ArrayList<>();
            emps.add("张三");
            emps.add("李四");

            model.addAttribute("emps", emps);
            return "list";
        }
    }
}

client2

@Controller
public class HelloController {

    @Value("${sso.server.url}")
    String ssoServerUrl;
    
    @ResponseBody
    @GetMapping(value = "/hello")
    public String hello() {
        return "hello";
    }
    @GetMapping(value = "/boss")
    // ssoserver登陆成功 之后 带回的token 不一定是会带回来的 设置required = false
    public String employees(Model model, HttpSession session,
                            @RequestParam(value = "token", required = false) String token) {

        if (!StringUtils.isEmpty(token)) {
            RestTemplate restTemplate = new RestTemplate();
            ResponseEntity<String> forEntity =
                    restTemplate.getForEntity("http://ssoserver.com:8080/userInfo?token=" + token, String.class);
            String body = forEntity.getBody();
            // todo 去ssoserver 获取当前token对应用户真正信息
            session.setAttribute("loginUser", body);
        }

        Object loginUser = session.getAttribute("loginUser");

        if (loginUser == null) {
            //没登录,跳转到服务器登录  重定向到 新地址 并携带之前地址
            //╱跳转过去以后,使用url上的查询参数标识我们自己是哪个页面
            return "redirect:" + ssoServerUrl + "?redirect_url=http://client2.com:8082/boss";
        } else {
            List<String> emps = new ArrayList<>();
            emps.add("张三");
            emps.add("李四");

            model.addAttribute("emps", emps);
            return "list";
        }
    }
}

标签:return,String,url,token,server,sso,client,public
From: https://blog.51cto.com/u_15993308/6327475

相关文章

  • 在 Windows Server 2022 中,微软取消了一些以前的功能。以下是一些被取消的功能
    在WindowsServer2022中,微软取消了一些以前的功能。以下是一些被取消的功能:InternetStorageNameService(iSNS):iSNS是一个网络服务协议,为iSCSI设备提供自动发现和配置。在WindowsServer2022中,iSNS被取消了,建议使用其他的自动发现和配置方法。PeerNameResolu......
  • 观察者模式(Observer Pattern)
    一、模式动机观察者模式用于描述对象之间的依赖关系,它引入了观察者和观察目标两类不同的角色,由于提供了抽象层,它使得增加新的观察者和观察目标都很方便。观察者模式广泛应用于各种编程语言的事件处理模型中,Java语言也提供了对观察者模式的全面支持。一个对象的状态或行为的变......
  • post-GWAS: transcriptome-wide association studies (TWAS) 结果解读
    Thetoppanelshowsallofthegenesinthelocus.ThemarginallyTWASassociatedgenesarehighlightedinblue,andthosethatarejointlysignificant(inthiscase,FAM109B)highlightedingreen.Thestatisticsforthejointlysignificantgenesarerepo......
  • @广州 智在粤港澳,Serverless 为创新提速
    风从海上来,潮涌大湾区。粤港澳大湾区建设再加速,云计算、人工智能等前沿科技持续激发产业潜能,催生产业全面迈向智能化。阿里云峰会·粤港澳大湾区,将为您呈现一幅科技创新新图景。云Serverless加速云上开发,用AI新范式见证数智化变革,激发想象力。本次峰会分为一场主论坛、13场分......
  • 在Windows Server 2022中使用Microsoft Deployment Toolkit(MDT)时,Bootstrap.ini文件是
    在WindowsServer2022中使用MicrosoftDeploymentToolkit(MDT)时,Bootstrap.ini文件是用于启动和定制Windows预安装环境(WinPE)的关键文件。以下是常见的Bootstrap.ini参数及其描述:[Settings]:指定设置组。Priority:指定Bootstrap.ini的优先级,以确定哪个Bootstrap.ini文件将被使用(如......
  • Windows server 2022 个人使用 优化批处理batch
    Windowsserver2022个人使用一些优化@echooffregadd"HKLM\SOFTWARE\Microsoft\ActiveSetup\InstalledComponents\{A509B1A7-37EF-4b3f-8CFC-4F3A74704073}"/v"IsInstalled"/tREG_DWORD/d00000000/fregadd"HKLM\SOFTWARE\Microsof......
  • 在Windows Server 2022中使用Microsoft Deployment Toolkit(MDT)时,可使用Rules(规则)文件
    在WindowsServer2022中使用MicrosoftDeploymentToolkit(MDT)时,可使用Rules(规则)文件来配置和自定义部署过程。以下是常见的Rules参数及其描述:UserDomain:指定要加入的域的名称。UserID和UserPassword:指定加入域所需的管理员帐户凭据。TimeZoneName:指定安装期间使用的时区。Jo......
  • Java使用HttpClient以multipart/form-data向接口上传文件
    前言对接某公司的接口,涉及到资质上传等业务。需要对接他们的上传附件接口。JDK1.8httpclient4.x封装httpclient方法publicstaticStringpostFileMultiPart(Stringurl,Map<String,ContentBody>reqParam)throwsIOException{ CloseableHttpClienthttpclient=HttpCl......
  • 通过sassoa低代码引擎平台快速搭建(财务核销-基础资料-银行列表)的管理功能
    快速预览:  首先拿到财务人员的需求是这样的:原始第一手需求。 001:因为表格中是有合并单元格的情况所以我们手动完成拆分单元格并且将文件存储为【银行列表.xlsx】放在电脑磁盘上的任意目录。002:在引擎系统管理后台、新建packages【销账基础资料】,点击新建table 页面......
  • set character_set_database=utf8;set character_set_server=utf8;
    D:\mysql-5.6.24-win32\bin\mysql-urootWelcometotheMySQLmonitor.Commandsendwith;or\g.YourMySQLconnectionidis55Serverversion:5.6.24MySQLCommunityServer(GPL)Copyright(c)2000,2015,Oracleand/oritsaffiliates.......