|
|
@@ -1,9 +1,9 @@
|
|
|
-package com.zheng.upms.admin.controller;
|
|
|
+package com.zheng.upms.server.controller;
|
|
|
|
|
|
import com.zheng.common.base.BaseController;
|
|
|
import com.zheng.common.util.CookieUtil;
|
|
|
import com.zheng.common.util.RedisUtil;
|
|
|
-import com.zheng.upms.admin.util.SystemConstant;
|
|
|
+import com.zheng.upms.server.util.SystemConstant;
|
|
|
import com.zheng.upms.dao.model.UpmsSystemExample;
|
|
|
import com.zheng.upms.rpc.api.UpmsSystemService;
|
|
|
import com.zheng.upms.rpc.api.UpmsUserService;
|
|
|
@@ -42,7 +42,14 @@ public class SSOController extends BaseController {
|
|
|
|
|
|
private final static Logger _log = LoggerFactory.getLogger(SSOController.class);
|
|
|
private final static int TIMEOUT = 2 * 60 * 60;
|
|
|
+ // 全局会话key
|
|
|
private final static String ZHENG_UPMS_SERVER_SESSION_ID = "zheng-upms-server-session-id";
|
|
|
+ // token key
|
|
|
+ private final static String ZHENG_UPMS_SERVER_TOKEN = "zheng-upms-server-token";
|
|
|
+ // 局部会话key
|
|
|
+ private final static String ZHENG_UPMS_CLIENT_SESSION_ID = "zheng-upms-client-session-id";
|
|
|
+ // 单点同一个token所有局部会话key
|
|
|
+ private final static String ZHENG_UPMS_CLIENT_SESSION_IDS = "zheng-upms-client-session-ids";
|
|
|
|
|
|
@Autowired
|
|
|
UpmsSystemService upmsSystemService;
|
|
|
@@ -57,7 +64,7 @@ public class SSOController extends BaseController {
|
|
|
* @throws Exception
|
|
|
*/
|
|
|
@RequestMapping(value = "/index", method = RequestMethod.GET)
|
|
|
- public String index(HttpServletRequest request, HttpServletResponse response) throws Exception {
|
|
|
+ public String index(HttpServletRequest request) throws Exception {
|
|
|
String system_name = request.getParameter("system_name");
|
|
|
String backurl = request.getParameter("backurl");
|
|
|
|
|
|
@@ -68,29 +75,9 @@ public class SSOController extends BaseController {
|
|
|
int count = upmsSystemService.countByExample(upmsSystemExample);
|
|
|
if (StringUtils.isEmpty(system_name) || 0 == count) {
|
|
|
_log.info("未注册的系统:{}", system_name);
|
|
|
- return "/404";
|
|
|
+ return "/500";
|
|
|
}
|
|
|
- // 分配单点登录sessionId,不使用session获取会话id,改为cookie,防止session丢失
|
|
|
- String sessionId = CookieUtil.getCookie(request, ZHENG_UPMS_SERVER_SESSION_ID);
|
|
|
- if (StringUtils.isEmpty(sessionId)) {
|
|
|
- sessionId = request.getSession().getId();
|
|
|
- CookieUtil.setCookie(response, ZHENG_UPMS_SERVER_SESSION_ID, sessionId);
|
|
|
- }
|
|
|
- // 判断是否存在全局会话
|
|
|
- // 未登录
|
|
|
- if (StringUtils.isEmpty(RedisUtil.get(sessionId + "_token"))) {
|
|
|
- return "redirect:/sso/login?backurl=" + URLEncoder.encode(backurl, "utf-8");
|
|
|
- }
|
|
|
- // 已登录
|
|
|
- String token = RedisUtil.get(sessionId + "_token");
|
|
|
- String redirectUrl = backurl;
|
|
|
- if (backurl.contains("?")) {
|
|
|
- redirectUrl += "&token=" + token;
|
|
|
- } else {
|
|
|
- redirectUrl += "?token=" + token;
|
|
|
- }
|
|
|
- _log.info("认证中心验证为已登录,跳回:{}", redirectUrl);
|
|
|
- return "redirect:" + redirectUrl;
|
|
|
+ return "redirect:/sso/login?backurl=" + URLEncoder.encode(backurl, "utf-8");
|
|
|
}
|
|
|
|
|
|
/**
|
|
|
@@ -98,24 +85,31 @@ public class SSOController extends BaseController {
|
|
|
* @return
|
|
|
*/
|
|
|
@RequestMapping(value = "/login", method = RequestMethod.GET)
|
|
|
- public String login(HttpServletRequest request) {
|
|
|
- String sessionId = CookieUtil.getCookie(request, ZHENG_UPMS_SERVER_SESSION_ID);
|
|
|
- _log.info("认证中心sessionId={}", sessionId);
|
|
|
+ public String login(HttpServletRequest request, HttpServletResponse response) {
|
|
|
+ // 分配单点登录sessionId,首次获取后缓存到cookie,防止session丢失
|
|
|
+ String serverSessionId = CookieUtil.getCookie(request, ZHENG_UPMS_SERVER_SESSION_ID);
|
|
|
+ if (StringUtils.isEmpty(serverSessionId)) {
|
|
|
+ serverSessionId = request.getSession().getId();
|
|
|
+ CookieUtil.setCookie(response, ZHENG_UPMS_SERVER_SESSION_ID, serverSessionId);
|
|
|
+ }
|
|
|
+ // 有回跳路径的访问判断是否已登录,如果已登录,则回跳
|
|
|
String backurl = request.getParameter("backurl");
|
|
|
- if (!StringUtils.isEmpty(sessionId) && !StringUtils.isEmpty(backurl)) {
|
|
|
- String token = RedisUtil.get(sessionId + "_token");
|
|
|
- // token校验值
|
|
|
- if (!StringUtils.isEmpty(token)) {
|
|
|
- // 回调子系统
|
|
|
- String redirectUrl = backurl;
|
|
|
+ String token = RedisUtil.get(ZHENG_UPMS_SERVER_SESSION_ID + "_" + serverSessionId);
|
|
|
+ // token校验值
|
|
|
+ if (!StringUtils.isEmpty(token)) {
|
|
|
+ // 回跳
|
|
|
+ String redirectUrl = backurl;
|
|
|
+ if (StringUtils.isEmpty(backurl)) {
|
|
|
+ redirectUrl = "/";
|
|
|
+ } else {
|
|
|
if (backurl.contains("?")) {
|
|
|
redirectUrl += "&token=" + token;
|
|
|
} else {
|
|
|
redirectUrl += "?token=" + token;
|
|
|
}
|
|
|
- _log.info("认证中心帐号通过,带token回跳:{}", redirectUrl);
|
|
|
- return "redirect:" + redirectUrl;
|
|
|
}
|
|
|
+ _log.info("认证中心帐号通过,带token回跳:{}", redirectUrl);
|
|
|
+ return "redirect:" + redirectUrl;
|
|
|
}
|
|
|
return "/sso/login";
|
|
|
}
|
|
|
@@ -148,7 +142,7 @@ public class SSOController extends BaseController {
|
|
|
Subject subject = SecurityUtils.getSubject();
|
|
|
UsernamePasswordToken usernamePasswordToken = new UsernamePasswordToken(username, password);
|
|
|
try {
|
|
|
- usernamePasswordToken.setRememberMe(false);
|
|
|
+ usernamePasswordToken.setRememberMe(true);
|
|
|
subject.login(usernamePasswordToken);
|
|
|
} catch (UnknownAccountException e) {
|
|
|
result.put("result", false);
|
|
|
@@ -163,18 +157,18 @@ public class SSOController extends BaseController {
|
|
|
result.put("data", SystemConstant.INVALID_ACCOUNT);
|
|
|
return result;
|
|
|
}
|
|
|
- // 分配单点登录sessionId,不使用session获取会话id,改为cookie,防止session丢失
|
|
|
- String sessionId = CookieUtil.getCookie(request, ZHENG_UPMS_SERVER_SESSION_ID);
|
|
|
- if (StringUtils.isEmpty(sessionId)) {
|
|
|
- sessionId = request.getSession().getId();
|
|
|
- CookieUtil.setCookie(response, ZHENG_UPMS_SERVER_SESSION_ID, sessionId);
|
|
|
+ // 分配单点登录sessionId,首次获取后缓存到cookie,防止session丢失
|
|
|
+ String serverSessionId = CookieUtil.getCookie(request, ZHENG_UPMS_SERVER_SESSION_ID);
|
|
|
+ if (StringUtils.isEmpty(serverSessionId)) {
|
|
|
+ serverSessionId = request.getSession().getId();
|
|
|
+ CookieUtil.setCookie(response, ZHENG_UPMS_SERVER_SESSION_ID, serverSessionId);
|
|
|
}
|
|
|
// 默认验证帐号密码正确,创建token
|
|
|
String token = UUID.randomUUID().toString();
|
|
|
// 全局会话sessionId
|
|
|
- RedisUtil.set(sessionId + "_token", token, TIMEOUT);
|
|
|
+ RedisUtil.set(ZHENG_UPMS_SERVER_SESSION_ID + "_" + serverSessionId, token, TIMEOUT);
|
|
|
// token校验值
|
|
|
- RedisUtil.set(token, token, TIMEOUT);
|
|
|
+ RedisUtil.set(ZHENG_UPMS_SERVER_TOKEN + "_" + token, token, TIMEOUT);
|
|
|
// 回调子系统
|
|
|
if (StringUtils.isEmpty(backurl)) {
|
|
|
result.put("result", true);
|
|
|
@@ -202,7 +196,7 @@ public class SSOController extends BaseController {
|
|
|
@ResponseBody
|
|
|
public String token(HttpServletRequest request) {
|
|
|
String tokenParam = request.getParameter("token");
|
|
|
- String token = RedisUtil.get(tokenParam);
|
|
|
+ String token = RedisUtil.get(ZHENG_UPMS_SERVER_TOKEN + "_" + tokenParam);
|
|
|
if (StringUtils.isEmpty(tokenParam) || !tokenParam.equals(token)) {
|
|
|
return "failed";
|
|
|
}
|
|
|
@@ -219,24 +213,24 @@ public class SSOController extends BaseController {
|
|
|
public String logout(HttpServletRequest request, HttpServletResponse response) {
|
|
|
// shiro退出登录
|
|
|
SecurityUtils.getSubject().logout();
|
|
|
- // 清除单点sessionId
|
|
|
- CookieUtil.removeCookie(response, ZHENG_UPMS_SERVER_SESSION_ID);
|
|
|
|
|
|
- String sessionId = CookieUtil.getCookie(request, ZHENG_UPMS_SERVER_SESSION_ID);
|
|
|
- // 当前全局会话sessionId
|
|
|
- String token = RedisUtil.get(sessionId + "_token");
|
|
|
+ String serverSessionId = CookieUtil.getCookie(request, ZHENG_UPMS_SERVER_SESSION_ID);
|
|
|
+ // 当前全局会话token
|
|
|
+ String token = RedisUtil.get(ZHENG_UPMS_SERVER_SESSION_ID + "_" + serverSessionId);
|
|
|
// 清除全局会话
|
|
|
- RedisUtil.remove(sessionId + "_token");
|
|
|
+ RedisUtil.remove(ZHENG_UPMS_SERVER_SESSION_ID + "_" + serverSessionId);
|
|
|
// 清除token校验值
|
|
|
- RedisUtil.remove(token);
|
|
|
+ RedisUtil.remove(ZHENG_UPMS_SERVER_TOKEN + "_" + token);
|
|
|
// 清除所有局部会话
|
|
|
Jedis jedis = RedisUtil.getJedis();
|
|
|
- Set<String> subSessionIds = jedis.smembers(token + "_subSessionIds");
|
|
|
- for (String subSessionId : subSessionIds) {
|
|
|
- jedis.del(subSessionId + "_token");
|
|
|
- jedis.srem(token + "_subSessionIds", subSessionId);
|
|
|
+ Set<String> clientSessionIds = jedis.smembers(ZHENG_UPMS_CLIENT_SESSION_IDS + "_" + token);
|
|
|
+ for (String clientSessionId : clientSessionIds) {
|
|
|
+ jedis.del(ZHENG_UPMS_CLIENT_SESSION_ID + "_" + clientSessionId);
|
|
|
+ jedis.srem(ZHENG_UPMS_CLIENT_SESSION_IDS + "_" + token, clientSessionId);
|
|
|
}
|
|
|
- _log.info("当前token={},对应的注册系统还剩余:{}个", token, jedis.scard(token + "_subSessionIds"));
|
|
|
+ // 清除全局会话sessionId
|
|
|
+ CookieUtil.removeCookie(response, ZHENG_UPMS_SERVER_SESSION_ID);
|
|
|
+ _log.info("当前token={},对应的注册系统个数:{}个", token, jedis.scard(ZHENG_UPMS_CLIENT_SESSION_IDS + "_" + token));
|
|
|
// 跳回原地址
|
|
|
String redirectUrl = request.getHeader("Referer");
|
|
|
_log.info("跳回退出登录请求地址:{}", redirectUrl);
|