广告
返回顶部
首页 > 资讯 > 后端开发 > Python >SpringBoot如何实现同域SSO(单点登录)
  • 615
分享到

SpringBoot如何实现同域SSO(单点登录)

2024-04-02 19:04:59 615人浏览 独家记忆

Python 官方文档:入门教程 => 点击学习

摘要

目录如何实现同域SSO?代码实现依赖配置控制器拦截器实现界面单点登录,其实看起来不是很复杂,只是细节上的处理,单点区分有三种 同域SSO 同父域SSO

单点登录,其实看起来不是很复杂,只是细节上的处理,单点区分有三种

  • 同域SSO
  • 同父域SSO
  • 跨域的SSO

如何实现同域SSO?

个人理解:当用户登录访问demo1.lzmvlog.top时,同时具有访问demo2.lzmvlog.top的能力,即认证完成一次,可以访问所有系统。

实现方式:可以采用Cookie实现,即用户在访问一个系统时,携带认证颁发的信息,系统响应是否具有访问资格,否则跳转认证,也可以采用Session,即Session共享,校验访问用户是否具有有效的信息,提供访问资格

代码实现

依赖


<!--spring-data-jpa-->
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-data-jpa</artifactId>
</dependency>
<!-- Mysql -->
<dependency>
    <groupId>mysql</groupId>
    <artifactId>mysql-connector-java</artifactId>
</dependency>

配置


server:
  port: 8090

spring:
  application:
    name: authority
  datasource:
    url: jdbc:mysql://127.0.0.1:3306/SSO?useUnicode=true&characterEncoding=utf8&useSSL=false&allowPublicKeyRetrieval=true&serverTimezone=GMT%2B8
    username: root
    passWord: 123456
    driver-class-name: com.mysql.cj.jdbc.Driver

当用户访问除登录界面时,都需要提前认证,认证完成之后需要跳转到之前访问的路径上,并提供访问别的系统的权限。

实现逻辑,当用户访问任何路径时,都需要通过拦截器的校验,确认拥有访问的权限,才能放行通过,不具有访问权限的,重定向到 登录界面,并保存原有访问的页面路径,验证成功的时候跳转到原有页面

控制器


@Controller
public class IndexController {

    @Autowired
    UserRepository userRepository;

    
    public String url;

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

    
    @GetMapping("/")
    public String index1() {
        return "index";
    }

    
    @PostMapping("login")
    public String login(String username, String password, httpservletResponse response) {
        // 用户登录
        boolean exists = userRepository.exists(Example.of(new User()
                .setUsername(username)
                .setPassword(password)));
        if (exists) {
            Cookie cookie = new Cookie("username", username);
            response.addCookie(cookie);
            // 如果正常访问即跳转到正常页面
            if (StringUtils.isEmpty(url)) {
                return "demo1";
            }
            // 如果之前存在访问的页面,认证完成即跳转会原有的页面
            return url;
        }
        return "index";
    }

    
    @GetMapping("demo2")
    public String demo2() {
        return "demo2";
    }

    
    @GetMappi=ng("demo1")
    public String demo1() {
        return "demo1";
    }

}

拦截器实现


@Component
public class CookieHandlerInterceptor implements HandlerInterceptor {

    @Autowired
    UserRepository userRepository;

    @Autowired
    IndexController indexController;

    
    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
        // 获取当前请求得路径 如果不是正常得登录界面请求 登录成功之后需要跳转到原来请求得界面上
        String servletPath = request.getServletPath();
        // 对不需要拦截得路径进行放行
        if ("/index".equals(servletPath) || "/".equals(servletPath) || "/login".equals(servletPath)) {
            return true;
        }
        if (!"/index".equals(servletPath) || !"/".equals(servletPath)) {
            indexController.url = servletPath;
        }
        Cookie[] cookies = request.getCookies();
        boolean exists = false;
        if (cookies != null) {
            for (Cookie cookie : cookies) {
                String value = cookie.getValue();
                if (!StringUtils.isEmpty(value)) {
                    exists = userRepository.exists(Example.of(new User()
                            .setUsername(value)));
                }
            }
        }
        if (exists) {
            return true;
        } else {
            response.sendRedirect("/index");
        }
        return false;
    }
}

SpringBoot2.x之后不能生效,需要将拦截器添加到拦截器链路中,即:


@Configuration
public class WEBmvcConfig extends WebMvcConfigurationSupport {

    
    @Autowired
    private CookieHandlerInterceptor cookieHandlerInterceptor;

    
    @Override
    protected void addInterceptors(InterceptorReGIStry registry) {
        registry.addInterceptor(this.cookieHandlerInterceptor).addPathPatterns("/**");
        super.addInterceptors(registry);
    }

}

其实拦截器还有第二种实现方式,即通过Filter接口实现


@Component
public class CookieFilter extends OncePerRequestFilter {

    @Autowired
    UserRepository userRepository;

    @Override
    protected void doFilterInternal(HttpServletRequest request, HttpServletResponse response, FilterChain filterChain) throws ServletException, IOException {

        // 获取当前请求得路径 如果不是正常得登录界面请求 登录成功之后需要跳转到原来请求得界面上
        String servletPath = request.getServletPath();
        IndexController indexController = new IndexController();
        // 对不需要拦截得路径进行放行
        if ("/index".equals(servletPath) || "/".equals(servletPath) || "/login".equals(servletPath)) {
            filterChain.doFilter(request, response);
        }
        if (!"/index".equals(servletPath) || !"/".equals(servletPath)) {
            indexController.url = servletPath;
        }
        Cookie[] cookies = request.getCookies();
        boolean exists = false;
        if (cookies != null) {
            for (Cookie cookie : cookies) {
                String value = cookie.getValue();
                if (!StringUtils.isEmpty(value)) {
                    exists = userRepository.exists(Example.of(new User()
                            .setUsername(value)));
                }
            }
        }
        if (exists) {
            filterChain.doFilter(request, response);

        } else {
            response.sendRedirect("/");
        }
    }
}

其实也可以采用Session的方式实现,采用共享Session的方式,我这里只是简单的实现一下,其实在认证时可以结合SpringSecurity或者shiro安全框架去整合Jwt以保证信息的安全

界面

index.html


<!DOCTYPE html>
<html>
<head>
    <meta charset="UTF-8">
    <title>登录</title>
</head>
<body>
<div align="center">
    <h1>请登录</h1>
    <fORM action="/login" method="post">
        <span>账号:</span><input name="username" type="text" value="zhang"><br>
        <span>密码:</span><input name="password" type="password" value="123456"><br>
        <button type="submit" style="margin: 10px 0">登录</button>
    </form>
</div>
</body>
</html>

demo1.htmldemo2.html只需要坐一下简单的区分,知道是哪个页面就行了

同域SSO其实不是很复杂,只是了解一下整个访问的过程,和需要做的一些限制即可,后续看看做后面两种的实现

同父域SSO跨域SSO

以上就是SpringBoot如何实现同域SSO(单点登录)的详细内容,更多关于SpringBoot 实现同域SSO的资料请关注编程网其它相关文章!

--结束END--

本文标题: SpringBoot如何实现同域SSO(单点登录)

本文链接: https://www.lsjlt.com/news/125795.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • SpringBoot如何实现同域SSO(单点登录)
    目录如何实现同域SSO?代码实现依赖配置控制器拦截器实现界面单点登录,其实看起来不是很复杂,只是细节上的处理,单点区分有三种 同域SSO 同父域SSO ...
    99+
    2022-11-12
  • java单点登录(SSO)的实现
    单点登录(SSO):SSO是指在多个应用系统中个,用户只需要登陆一次就可以访问所有相互信任的应用系统。它包括可以将这次主要的登录映射到其他应用中用于同一用户的登陆的机制。 SSO的实...
    99+
    2022-11-12
  • springboot 集成cas5.3 实现sso单点登录详细流程
    什么是单点登录? 单点登录(Single Sign On),简称为 SSO,是目前比较流行的企业业务整合的解决方案之一。SSO的定义是在多个应用系统中,用户只需要登录一次就可以访问所...
    99+
    2022-11-12
  • PHP SSO单点登录实现原理解析
    随着互联网的发展,人们在使用各种网站和应用程序的过程中常常遇到需要重新登录的问题,这不仅浪费了用户的时间,也给用户带来了不便。为了解决这个问题,SSO(Single Sign-On)单点登录技术应运而生。一、SSO单点登录的概念SSO(Si...
    99+
    2023-10-21
    PHP SSO (单点登录) 实现原理解析
  • PHP中实现SSO单点登录的方法
    这篇文章主要讲解了“PHP中实现SSO单点登录的方法”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“PHP中实现SSO单点登录的方法”吧!SSO( Single Sign On ),即单点登录...
    99+
    2023-06-20
  • 实现SSO单点登录的步骤是什么
    这篇文章主要介绍“实现SSO单点登录的步骤是什么”,在日常操作中,相信很多人在实现SSO单点登录的步骤是什么问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”实现SSO单点登录的...
    99+
    2022-10-19
  • 如何实现Spring+ Spring cloud + SSO单点登录应用认证
    今天就跟大家聊聊有关如何实现Spring+ Spring cloud + SSO单点登录应用认证,可能很多人都不太了解,为了让大家更加了解,小编给大家总结了以下内容,希望大家根据这篇文章可以有所收获。不同系统的无缝隙集成,统一的sso单点登...
    99+
    2023-06-05
  • 如何解决SSO单点登录重定向
    这篇文章主要讲解了“如何解决SSO单点登录重定向”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“如何解决SSO单点登录重定向”吧!当我们写好SSO单点登录服务...
    99+
    2022-10-19
  • 如何使用PHP实现高效稳定的SSO单点登录
    引言:随着互联网应用的普及,用户面临着大量的注册和登录过程。为了提高用户体验,并减少用户的注册和登录间隔,许多网站和应用开始采用单点登录(Single Sign-On,简称SSO)技术。本文将介绍如何使用PHP实现高效稳定的SSO单点登录,...
    99+
    2023-10-21
    PHP SSO 单点登录
  • php如何实现SSO登录
    本文操作环境:Windows7系统、PHP7.1版、Dell G3电脑。php如何实现SSO登录SSO单点登录设计及PHP实现建议先熟悉单点登录SSO相关概念。 SSO:单点登录,一次登录,所有相关系统均可以进入,无需重复登录实现方案:共享...
    99+
    2019-04-16
    php SSO
  • SpringBoot单点登录怎么实现
    这篇文章主要介绍了SpringBoot单点登录怎么实现的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇SpringBoot单点登录怎么实现文章都会有所收获,下面我们一起来看看吧。1.具体实现步骤添加拦截器,设置U...
    99+
    2023-07-04
  • 基于ASP.NET实现单点登录(SSO)的示例代码
    目录背景逻辑分析代码实现Service总结背景 先上个图,看一下效果: SSO英文全称Single Sign On(单点登录)。SSO是在多个应用系统中,用户只需要登录一次就可以访...
    99+
    2022-11-13
  • 聊聊基于Node实现单点登录(SSO)的方法
    以上就是聊聊基于Node实现单点登录(SSO)的方法的详细内容,更多请关注编程网其它相关文章!...
    99+
    2023-05-14
    SSO 单点登录 node
  • vue+springboot前后端分离如何实现单点登录跨域问题
    这篇文章主要介绍vue+springboot前后端分离如何实现单点登录跨域问题,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!代码如下:@Configuration public&nb...
    99+
    2022-10-19
  • SpringBoot+CAS整合服务端和客户端实现SSO单点登录与登出快速入门上手
    文章目录 一、教学讲解视频二、前言三、准备工作四、CAS Server服务端搭建五、CAS Client客户端搭建六、结尾 一、教学讲解视频 教学讲解视频地址:视频地址 二、前言 因为CAS支持HTTP请求访问,而我们是快速入门...
    99+
    2023-08-18
    spring boot java CAS
  • gtoken如何替换jwt实现sso登录
    今天小编给大家分享一下gtoken如何替换jwt实现sso登录的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一下吧。gtoken服务...
    99+
    2023-07-02
  • gtoken替换jwt如何实现sso登录
    这篇“gtoken替换jwt如何实现sso登录”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇“gtoken替换jwt如何实现s...
    99+
    2023-06-30
  • springboot简单实现单点登录的示例代码
    什么是单点登录就不用再说了,今天通过自定义sessionId来实现它,想了解的可以参考https://www.xuxueli.com/xxl-sso/ 讲一下大概的实现思路吧:这里有...
    99+
    2022-11-12
  • 利用 PHP Session 跨域实现单点登录
    随着互联网技术的发展,单点登录(Single Sign-On,简称 SSO)成为了很多网站和应用程序的需求。SSO 可以使用户通过一次登录验证,即可在多个相关域中无需再次登录。在本文中,我们将介绍如何使用 PHP Session 跨域实现单...
    99+
    2023-10-21
    PHP Session 跨域 单点登录
  • vue前后端分离如何实现单点登录跨域
    这篇文章主要介绍“vue前后端分离如何实现单点登录跨域”,在日常操作中,相信很多人在vue前后端分离如何实现单点登录跨域问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”vue前后端分离如何实现单点登录跨域”的疑...
    99+
    2023-07-04
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作