先把源码贴出来,再慢慢讲解思路和原理以及实现方式
-->源代码1.0
整合了Mybatis +redis/redis集群二级缓存+cookie加密机制+token
-->源代码2.1 密码:5npa
1 什么是单点登录?
2 功能分析
单点登录这里我用三个工程来 实现和演示
1 ssoServer 是认证中心,所有用户的登录操作都在这里完成
基于maven ,使用ssm搭建
2 sso_app1 系统的分应用服务器1
基于maven,因为只是用来演示,所以使用的是原生servlet
3 sso_app2 系统的分应用服务器2.
基于maven,因为只是用来演示,所以使用的是原生servlet
单Web应用登录,主要涉及到认证、授权、会话建立、取消会话等几个关键环节。推广到多系统,每个系统也会涉及到认证、授权、会话建立取消等工作。那我们能不能把每个系统的认证工作抽象出来,放到单独的服务应用中取处理,是不是就能解决单点登录问题?
思考方向是正确的,我们把这个统一处理认证服务的应用叫认证中心。当用户访问子系统需要登录时,我们把它引到认证中心,让用户到认证中心去登录认证,认证通过后返回并告知系统用户已登录。当用户再访问另一系统应用时,我们同样引导到认证中心,发现已经登录过,即返回并告知该用户已登录。
用户登录:
用户首次登录时流程如下:
1.用户浏览器访问系统A需登录受限资源。
2.系统A发现该请求需要登录,将请求重定向到认证中心,进行登录。
3.认证中心呈现登录页面,用户登录,登录成功后,认证中心重定向请求到系统A,并附上认证通过令牌。
4.系统A与认证中心通信,验证令牌有效,证明用户已登录。
5.系统A将受限资源返给用户。
用户登出:
整个登出流程如下:
1.客户端向应用A发送登出Logout请求。
2.应用A取消本地会话,同时通知认证中心,用户已登出。
3.应用A返回客户端登出请求。
4.认证中心通知所有用户登录访问的应用,用户已登出。
3 接口设计
经过归纳分析一共6个主要接口 4个是服务端的 2个是每个客户端需要实现的接口:
ssoServer接口:
1登录页
/auth/toLogin
描述:进入输入登录信息页面。(通过应用重定向,或者直接访问登录页面)
2登录
/auth/login
描述:登录页面提交的登录请求(账号,密码)。
3令牌验证
/ticket/verify
描述:验证令牌是否有效,应用服务器通过发送HTTP请求来校验令牌是否有效
4登出
/auth/loginOut
描述:退出当前用户的登录状态,同时退出所有子系统(应用服务器)的登录状态。
ssoClient(应用服务器)接口:
1登出
/exit
退出登录,重定向到认证中心的退出接口,并携带本应用的首页(认证中心退出成功后重定向的页面)
2用户中心
/main
需要登陆授权的网页
4 核心代码
服务端:
登录controller
package rg.sso.controller;
import java.io.IOException;
import java.security.Principal;
import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;
import java.util.Map.Entry;
import javax.servlet.http.Cookie;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.util.DigestUtils;
import org.springframework.util.StringUtils;
import org.springframework.web.bind.annotation.CookieValue;
import org.springframework.web.bind.annotation.RequestMapping;
import com.mysql.fabric.Response;
import com.mysql.jdbc.interceptors.SessionAssociationInterceptor;
import rg.sso.bean.User;
import rg.sso.cache.GlobalSessionCache;
import rg.sso.cache.redis.RedisCache;
import rg.sso.service.UserService;
import rg.sso.util.ConfigUtil;
import rg.sso.util.CookieUtil;
import rg.sso.util.HttpUtil;
import rg.sso.util.Md5Util;
import rg.sso.util.StringUtil;
/**
* @Title:AuthController
* @Description:授权控制器</