牛骨文教育服务平台(让学习变的简单)
博文笔记

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

创建时间:2017-07-03 投稿人: 浏览次数:759

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

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

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

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

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

  如下图所示:
  这里写图片描述

登录成功 生成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
这里写图片描述
//结构流程图
这里写图片描述

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;
    }
}
声明:该文观点仅代表作者本人,牛骨文系教育信息发布平台,牛骨文仅提供信息存储空间服务。