一、基于cookie,各个子系统统一调用用户身份校验系统
sso-master 为统一校验中心,
SsoCheck 提供对登录的校验和客户端cookie的验证
/**
* 统一处理login请求
*
* @param loginname 用户名
* @param password 密码
*/
@PostMapping("/auth")
public Result<Map<String, Object>> checkLogin(String loginname, String password) {
System.out.println("统一登录校验");
ComplatlUser user = userService.login(loginname, password);
if (user != null) {
//封装参数
Map<String, Object> param = new HashMap<>();
List<TbDomain> domains = new ArrayList<>();
domains = domainService.selectAll();
List<String> domainUrl = new ArrayList<>(domains.size());
domains.forEach(domain -> {
domainUrl.add(domain.getDomain() + "/addcookie");
});
//生成jwt
String cookieName = "jian";
String cookieValue = new JwtUtil(loginname, null).creatJwt();
param.put("cookieurl", domainUrl);
param.put("cookieName", cookieName);
param.put("cookieValue", cookieValue);
Result<Map<String, Object>> result = new Result<>(ResultCodeEnum.AUTHSUCCESS);
result.setData(param);
return result;
}
return new Result<>(ResultCodeEnum.UNAUTHORIZEd, "账号或密码错误");
}
/**
* 添加需要清除的cookie
*/
@GetMapping("/loginout")
public String loginOut(HttpServletRequest request) {
String callbackFuncation = request.getParameter("callback");
System.out.println("start clear");
List<TbDomain> domains = domainService.selectAll();
List<String> domainUrl = new ArrayList<>(domains.size());
domains.forEach(domain -> {
domainUrl.add(domain.getDomain() + "/clear");
});
String resultMsg = JSON.toJSONString(domainUrl);
return callbackFuncation + "(" + resultMsg + ")";
}
/**
* 验证cookie是否通过
*
* @param cookieName cookie名称
* @param cookieValue cookie内容
* @return 是否认证成功
*/
@GetMapping("/authcookies")
public String checkAuthCookies(String cookieName, String cookieValue) {
boolean isUpdate = new JwtUtil(null, cookieValue).freeJwt();
String loginname = new JwtUtil(null, cookieValue).freeJwtLoginName();
if ("jian".equals(cookieName)) {
if (isUpdate) {
System.out.println("cookie验证通过");
return loginname;
}
}
return "";
}
soc改造:
登录页面:
<form autocomplete="off" action="${ctx}/ssologin" method="post">
<div class="cont">
<div class="item abs_usr">
<i></i>
<div>
<input type="textbox" id="loginname" name="loginname" placeholder="用户名" value="${loginname}" disableautocomplete>
</div>
</div>
<div class="item abs_pwd">
<i></i>
<div>
<input type="password" id="password" name="password" placeholder="密码" value="${password}" disableautocomplete>