SSO单点登录基本概念实现思路以及小的实例详解
2017-07-03 17:05
931 查看
一、什么是单点登录SSO(Single Sign-On)
SSO是一种统一认证和授权机制,指访问同一服务器不同应用中的受保护资源的同一用户,只需要登录一次,即通过一个应用中的安全验证后,再访问其他应用中的受保护资源时,不再需要重新登录验证。
二、单点登录解决了什么问题
解决了用户只需要登录一次就可以访问所有相互信任的应用系统,而不用重复登录。
三、单点登录的技术实现机制
如下图所示:
登录成功 生成ticket身份令牌 并添加到Cookie 访问其他业务则验证ticket 存在则不需要再次登录 并获取Cookie 这里可以考虑拦截器进行验证
下面一个简单的实例 利用struts2实现一次登录 就可以访问所有
//需要的struts2 jar
//结构流程图
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,keyword fa49 3"> <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; } }
相关文章推荐
- C#反射概念以及实例详解
- JVM内存参数详解以及配置调优(一)-基本概念
- OS中 main.h 的一些基本概念 以及 类与对象的概念及其实现
- 8_14 日学到的新知识(简单的工厂模式的实现, MVC 模式的基本概念,软件工程中的四种开发模型, 以及软件工程中的一些小知识点)
- Spring---AOP基本概念以及Advice5种类型的通知注解应用实例
- java中注解的基本概念以及实例
- C#反射概念以及实例详解
- mybatis如何实现批量更新和插入新增实例详解(附SQL以及mapper配置)
- C#反射概念以及实例详解
- 防盗链概念详解以及自己使用tomcat实现一个防盗链
- C#反射概念以及实例详解
- python基于mysql实现的简单队列以及跨进程锁实例详解
- C#反射概念以及实例详解【转】
- Ajax基本概念以及JS实现Ajax的过程
- C#反射概念以及实例详解
- C#反射概念以及实例详解
- C#反射概念以及实例详解
- C#反射概念以及实例详解
- J2EE项目系列(四)--SSM框架构建积分系统和基本商品检索系统(Spring+SpringMVC+MyBatis)(3)Ajax使用详解(级联列表)以及企业级报表Excel导入导出实现
- AngularJS通过ng-route实现基本的路由功能实例详解