首页 > 其他分享 >SSO单点登录基本概念实现思路以及小的实例详解

SSO单点登录基本概念实现思路以及小的实例详解

时间:2023-07-10 10:37:09浏览次数:37  
标签:单点 String 登录 return SSO 详解 import gotoUrl public


一、什么是单点登录SSO(Single Sign-On)

  SSO是一种统一认证和授权机制,指访问同一服务器不同应用中的受保护资源的同一用户,只需要登录一次,即通过一个应用中的安全验证后,再访问其他应用中的受保护资源时,不再需要重新登录验证。

二、单点登录解决了什么问题

  解决了用户只需要登录一次就可以访问所有相互信任的应用系统,而不用重复登录。

三、单点登录的技术实现机制

  如下图所示:

  

SSO单点登录基本概念实现思路以及小的实例详解_java单点登录系统

登录成功 生成ticket身份令牌 并添加到Cookie 访问其他业务则验证ticket 存在则不需要再次登录 并获取Cookie 这里可以考虑拦截器进行验证
下面一个简单的实例 利用struts2实现一次登录 就可以访问所有

<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<%
String path = request.getContextPath();
String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";
%>

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
  <head>
    <base href="<%=basePath%>">

    <title>My JSP 'login.jsp' starting page</title>

    <meta http-equiv="pragma" content="no-cache">
    <meta http-equiv="cache-control" content="no-cache">
    <meta http-equiv="expires" content="0">    
    <meta http-equiv="keywords" content="keyword1,keyword2,keyword3">
    <meta http-equiv="description" content="This is my page">
    <!--
    <link rel="stylesheet" type="text/css" href="styles.css">
    -->
<!-- 登录页面 -->
  </head>

  <body>
    <center>
    <h1>请登录</h1>
    <form action="${pageContext.request.contextPath}/sso/doLogin.action" name="doLogin" method="post">
    用户名:<input type="text"    name="username"/>
    密码:<input type="password" name="password"/>
    <input type="hidden" name="gotoUrl" value="${gotoUrl}"/>
    <input type="submit" />
    </form>
    </center>
  </body>
</html>
<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<%
String path = request.getContextPath();
String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";
%>

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
  <head>
    <base href="<%=basePath%>">

    <title>欢迎访问DEMO1</title>

    <meta http-equiv="pragma" content="no-cache">
    <meta http-equiv="cache-control" content="no-cache">
    <meta http-equiv="expires" content="0">    
    <meta http-equiv="keywords" content="keyword1,keyword2,keyword3">
    <meta http-equiv="description" content="This is my page">
    <!--
    <link rel="stylesheet" type="text/css" href="styles.css">
    -->

  </head>

  <body>
  欢迎访问DEMO1的主页
  </body>
</html>
<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<%
String path = request.getContextPath();
String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";
%>

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
  <head>
    <base href="<%=basePath%>">

    <title>欢迎访问DEMO2</title>

    <meta http-equiv="pragma" content="no-cache">
    <meta http-equiv="cache-control" content="no-cache">
    <meta http-equiv="expires" content="0">    
    <meta http-equiv="keywords" content="keyword1,keyword2,keyword3">
    <meta http-equiv="description" content="This is my page">
    <!--
    <link rel="stylesheet" type="text/css" href="styles.css">
    -->

  </head>

  <body>
  欢迎访问DEMO2的主页
  </body>
</html>
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE struts PUBLIC "-//Apache Software Foundation//DTD Struts Configuration 2.1//EN" "http://struts.apache.org/dtds/struts-2.1.dtd">
<!--struts2配置  -->

<struts>
<package name="sso"  extends="struts-default" namespace="/sso">
    <action name="doLogin" class="com.kero99.ygc.sso.SSOAction" method="doLogin">
    <result name="success"  type="redirect">/${gotoUrl}</result>
    </action>                               
</package>
<package name="dome1"  extends="struts-default"   namespace="/demo1"> 
    <action name="main" class="com.kero99.ygc.demo1.Demo1Action" method="main">
    <result name="success">/success1.jsp</result>
    <result name="login">/login.jsp</result>    
    </action>
</package>

<package name="dome2"  extends="struts-default" namespace="/demo2"> 
    <action name="main" class="com.kero99.ygc.demo2.Demo2Action" method="main">
    <result name="success">/success2.jsp</result>   
    <result name="login">/login.jsp</result>    
    </action>
</package>

</struts>

//需要的struts2 jar

SSO单点登录基本概念实现思路以及小的实例详解_实例_02


//结构流程图

SSO单点登录基本概念实现思路以及小的实例详解_单点登录_03

package com.kero99.ygc.sso;

import javax.servlet.http.Cookie;
import javax.servlet.http.HttpServletResponse;

import org.apache.struts2.ServletActionContext;

import com.kero99.ygc.util.SSOCheck;
import com.opensymphony.xwork2.ActionSupport;

public class SSOAction extends ActionSupport {
    /**
     * SSO 登录验证 并添加到 Cookie 为了方便失败为null 
     * eg:http://localhost:8082/20170702_V1.0_sso/demo1/main.action
     * 本人的访问路径20170702_V1.0_sso web Context root 可以进行更改成本地的
     * gotoUrl 为 重定向路径 
     * util 下user=ygc pwd=123 为登录验证
     * ckeckCookie 验证Cookie是否存在 
     * /demo1/main.action
     * /demo2/main.action
     * 进行测试
     * 
     */
    private static final long serialVersionUID = 1L;
    private String  username;
    private String password;
    private String gotoUrl;
    //登录接口
    public String doLogin(){
        System.out.println("login方法执行了...");
        boolean ok=SSOCheck.checkLogin(username, password);
        if(ok){
            Cookie cookie=new Cookie("ssocookie","sso");
            cookie.setPath("/");
            HttpServletResponse response=ServletActionContext.getResponse();
            response.addCookie(cookie);
            return SUCCESS;
        }
        return null;

    }

    public String getGotoUrl() {
        return gotoUrl;
    }

    public void setGotoUrl(String gotoUrl) {
        this.gotoUrl = gotoUrl;
    }

    public String getUsername() {
        return username;
    }
    public void setUsername(String username) {
        this.username = username;
    }
    public String getPassword() {
        return password;
    }
    public void setPassword(String password) {
        this.password = password;
    }
}
package com.kero99.ygc.util;

import javax.servlet.http.Cookie;
import javax.servlet.http.HttpServletRequest;

public class SSOCheck {
    private static final String USERNAME="ygc";
    private  static final String PASSWORD="123";
    //验证登录
    public static  boolean checkLogin(String username,String password){
        if(username.equals(USERNAME) && password.equals(PASSWORD)){
            return true;
        }

        return false;
    }
    //登录效验接口
    public static boolean ckeckCookie(HttpServletRequest request){
        Cookie[] cookies=request.getCookies();
        if(cookies!=null){
            for(Cookie cookie:cookies){
                if(cookie.getName().equals("ssocookie") && cookie.getValue().equals("sso")){
                    return true;
                }
            }
        }
        return false;
    }
}
package com.kero99.ygc.demo1;

import javax.servlet.http.HttpServletRequest;

import org.apache.struts2.ServletActionContext;

import com.kero99.ygc.util.SSOCheck;
import com.opensymphony.xwork2.ActionSupport;

public class Demo1Action extends ActionSupport {
    /**
     * Demo1接口
     */
    private static final long serialVersionUID = 1L;
    private String gotoUrl;
    public String main(){
        HttpServletRequest request=ServletActionContext.getRequest();
        if(SSOCheck.ckeckCookie(request)){
            return SUCCESS;
        }
        gotoUrl="/demo1/main.action";
        return LOGIN;
    }
    public String getGotoUrl() {
        return gotoUrl;
    }
    public void setGotoUrl(String gotoUrl) {
        this.gotoUrl = gotoUrl;
    }

}
package com.kero99.ygc.demo2;

import javax.servlet.http.HttpServletRequest;

import org.apache.struts2.ServletActionContext;

import com.kero99.ygc.util.SSOCheck;
import com.opensymphony.xwork2.ActionSupport;

public class Demo2Action extends ActionSupport {
    /**
     * Demo2接口
     */
    private static final long serialVersionUID = 1L;
    private String gotoUrl;
    public String main(){
        HttpServletRequest request=ServletActionContext.getRequest();
        if(SSOCheck.ckeckCookie(request)){
            return SUCCESS;
        }
        gotoUrl="/demo2/main.action";
        return LOGIN;
    }
    public String getGotoUrl() {
        return gotoUrl;
    }
    public void setGotoUrl(String gotoUrl) {
        this.gotoUrl = gotoUrl;
    }
}


标签:单点,String,登录,return,SSO,详解,import,gotoUrl,public
From: https://blog.51cto.com/kero99/6674338

相关文章

  • MyEclipse 10 配置jad反编译工具步骤及详解
    MyEclipse10如何查看底层源码可以配置jad//下面是步骤:方法一1、下载jad158g.win.zip文件和net.sf.jadclipse_3.3.0.jar文件。2、将下载的jad158g.win.zip文件解压,并将jad.exe文件复制到jdk的安装目录下的jre文件夹下。例如:D:\develop\Java\jre7\bin\jad.exe。3、将下载的net......
  • Cesium导航指针放大缩小定位平移详解
    一、需求分析点击按钮可以对地图进行放大缩小,点击重置可以返回原先初始地点,点击指针球可以移动切换不同视角。二、代码实现我的版本为Cesium1.69 cesium-navigation-es61.1.6 源码有BUG需要更改安装命令:npm cesium-navigation-es6或者yarnadd npmi cesium-navigation......
  • SSO2.0 21-20230708
            ......
  • LLaMA模型指令微调 字节跳动多模态视频大模型 Valley 论文详解
    Valley:VideoAssistantwithLargeLanguagemodelEnhancedabilitY大家好,我是卷了又没卷,薛定谔的卷的AI算法工程师「陈城南」~担任某大厂的算法工程师,带来最新的前沿AI知识和工具,包括AI相关技术、ChatGPT、AI绘图等,欢迎大家交流~。近期基于LLaMA微调的模型有很多,Alpaca,Vi......
  • 详解Django请求与响应:深入理解Web Http交互的核心机制
    本文深入探讨了Django中的请求与响应处理,从Django请求和响应的基础知识、生命周期,到HttpRequest和HttpResponse对象的详细介绍。同时,讨论了Django的视图和请求、响应处理,以及安全性和异步处理的考虑。最后,对比了Django与Flask、FastAPI等框架在请求响应处理上的异同......
  • 基于MFC dll实现C++/CLI dll组件全过程详解(附完整源码) 浮云绘图
    ​模块化组件化实现独立的功能模块是软件设计的良好习惯,一般用实现为DLL。普通的DLL对外提供接口是采用导出函数接口,如果接口数量不大,只是50个以内,这种方式很适合;如果对外接口有上百个,导出函数接口就完全破坏了软件模块化分层设计的理念,使用接口非常麻烦,此情形采用C++/CLI导出类......
  • Vue详解设置路由导航的两种方法<router-link to=“”>和router.push(...)
    1.<router-linkto="">to里的值可以是一个字符串,也可以是一个描述地址的对象。//字符串<router-linkto="apple">toapple</router-link>//对象<router-link:to="{path:'apple'}">toapple</router-link>//命名路由&l......
  • C#三种定时器Timer详解
    https://blog.csdn.net/qq_57798018/article/details/128243618在C#中Timer类的定义有三个:System.Threading.TimerSystem.Windows.Forms.Timer//仅在.NetFramework中System.Timers.Timer1、System.Windows.Forms.Timer定时器System.Windows.Forms命名空间下的Timer控件,它......
  • 24.solidwork零件导入cad图纸详解
    1.从其他软件导出或者绘制2维图纸,保存cad图纸2.用solidwrk打开保存的CAD图纸,选择2d草图,选择mm,导入后打钩3.单击左键crrl+c复制4.CTRL+V复制到要绘制的零件图中5.右键单击导图,选择编辑草图平面,选择要放置的草图平面位置后草图与平面共面6.进入编辑草图,点击移动实体命......
  • 使用Java实现基于OAuth 2.0的单点登录功能
    本文将介绍如何使用Java编写一个基于OAuth2.0的单点登录系统,通过OAuth2.0实现用户在多个应用程序间的无缝登录体验1.什么是OAuth2.0?OAuth2.0是一种开放的授权框架,用于在应用程序之间安全地共享用户的身份验证和授权信息。它允许用户授权第三方应用程序代表其访问受保护的资......