E9单点登录1
parent
4c50bc4687
commit
1f2b304968
@ -0,0 +1,21 @@
|
||||
package cn.estsh.i3plus.core.api.iservice.base;
|
||||
|
||||
import cn.estsh.i3plus.pojo.model.platform.SystemLoginModel;
|
||||
import cn.estsh.impp.framework.boot.util.ResultBean;
|
||||
|
||||
import javax.servlet.http.HttpServletRequest;
|
||||
import java.util.function.BiFunction;
|
||||
|
||||
/**
|
||||
* @author Wynne.Lu
|
||||
* @date 2021/1/18 上午10:50
|
||||
* @desc
|
||||
*/
|
||||
public interface ISystemLoginStrategyService {
|
||||
/**
|
||||
* @param request
|
||||
* @param loginModel
|
||||
* @return
|
||||
*/
|
||||
BiFunction<HttpServletRequest, SystemLoginModel, ResultBean> login();
|
||||
}
|
@ -0,0 +1,44 @@
|
||||
package cn.estsh.i3plus.core.apiservice.auth.realm.strategy;
|
||||
|
||||
import cn.estsh.i3plus.core.api.iservice.base.ISystemLoginService;
|
||||
import cn.estsh.i3plus.pojo.base.shirotoken.AdminToken;
|
||||
import org.apache.shiro.authc.AuthenticationInfo;
|
||||
import org.apache.shiro.authc.AuthenticationToken;
|
||||
import org.apache.shiro.authc.SimpleAuthenticationInfo;
|
||||
import org.apache.shiro.authz.AuthorizationInfo;
|
||||
import org.apache.shiro.authz.SimpleAuthorizationInfo;
|
||||
import org.apache.shiro.realm.AuthorizingRealm;
|
||||
import org.apache.shiro.subject.PrincipalCollection;
|
||||
import org.slf4j.Logger;
|
||||
import org.slf4j.LoggerFactory;
|
||||
import org.springframework.beans.factory.annotation.Autowired;
|
||||
import org.springframework.stereotype.Component;
|
||||
|
||||
/**
|
||||
* @author Wynne.Lu
|
||||
* @date 2021/1/18 下午2:32
|
||||
* @desc
|
||||
*/
|
||||
@Component
|
||||
public class E9AuthRealm extends AuthorizingRealm {
|
||||
|
||||
public static final Logger LOGGER = LoggerFactory.getLogger(E9AuthRealm.class);
|
||||
|
||||
@Autowired
|
||||
private ISystemLoginService systemLoginService;
|
||||
|
||||
public E9AuthRealm(){
|
||||
//添加支持的token
|
||||
this.setAuthenticationTokenClass(AdminToken.class);
|
||||
}
|
||||
|
||||
@Override
|
||||
protected AuthorizationInfo doGetAuthorizationInfo(PrincipalCollection principalCollection) {
|
||||
return new SimpleAuthorizationInfo();
|
||||
}
|
||||
|
||||
@Override
|
||||
protected AuthenticationInfo doGetAuthenticationInfo(AuthenticationToken authenticationToken) {
|
||||
return new SimpleAuthenticationInfo();
|
||||
}
|
||||
}
|
@ -0,0 +1,87 @@
|
||||
package cn.estsh.i3plus.core.apiservice.serviceimpl.base.login.strategy;
|
||||
|
||||
import cn.estsh.i3plus.core.api.iservice.base.ISystemLoginService;
|
||||
import cn.estsh.i3plus.core.api.iservice.base.ISystemLoginStrategyService;
|
||||
import cn.estsh.i3plus.core.api.iservice.busi.ILicenseClickService;
|
||||
import cn.estsh.i3plus.core.api.iservice.busi.ISysUserService;
|
||||
import cn.estsh.i3plus.platform.common.util.CommonConstWords;
|
||||
import cn.estsh.i3plus.pojo.base.bean.BaseThreadLocal;
|
||||
import cn.estsh.i3plus.pojo.base.enumutil.CommonEnumUtil;
|
||||
import cn.estsh.i3plus.pojo.model.platform.SystemLoginModel;
|
||||
import cn.estsh.i3plus.pojo.platform.bean.SessionUser;
|
||||
import cn.estsh.impp.framework.boot.auth.AuthUtil;
|
||||
import cn.estsh.impp.framework.boot.util.ImppRedis;
|
||||
import cn.estsh.impp.framework.boot.util.RedisCacheTool;
|
||||
import cn.estsh.impp.framework.boot.util.ResultBean;
|
||||
import cn.estsh.impp.framework.boot.util.ValidatorBean;
|
||||
import lombok.extern.slf4j.Slf4j;
|
||||
import org.springframework.beans.factory.annotation.Autowired;
|
||||
import org.springframework.stereotype.Service;
|
||||
|
||||
import javax.annotation.Resource;
|
||||
import javax.servlet.http.HttpServletRequest;
|
||||
import java.util.function.BiFunction;
|
||||
|
||||
import static cn.estsh.i3plus.platform.common.util.CommonConstWords.DEFAULT_LANGUAGE;
|
||||
|
||||
/**
|
||||
* @author Wynne.Lu
|
||||
* @date 2021/1/18 下午4:39
|
||||
* @desc
|
||||
*/
|
||||
@Slf4j
|
||||
@Service
|
||||
public class DefaultLoginStrategy implements ISystemLoginStrategyService {
|
||||
|
||||
@Resource(name = "redisCore")
|
||||
protected ImppRedis redisCore;
|
||||
|
||||
@Autowired
|
||||
private ILicenseClickService licenseClickService;
|
||||
|
||||
@Autowired
|
||||
private ISysUserService userService;
|
||||
|
||||
@Autowired
|
||||
private ISystemLoginService loginService;
|
||||
|
||||
@Override
|
||||
public BiFunction<HttpServletRequest, SystemLoginModel, ResultBean> login() {
|
||||
return (request, loginModel) -> {
|
||||
ResultBean result;
|
||||
ValidatorBean.checkNotNull(loginModel.getLanguageCode(), "语言不能为空");
|
||||
// TODO 后期移除,暂时用于避免自动登录后前台没有正确的传输组织代码信息
|
||||
if ("null".equals(loginModel.getLanguageCode())) {
|
||||
loginModel.setLanguageCode(DEFAULT_LANGUAGE);
|
||||
}
|
||||
|
||||
// 设置语言代码
|
||||
BaseThreadLocal.setData(BaseThreadLocal.LANGUAGE_CODE, loginModel.getLanguageCode());
|
||||
|
||||
ValidatorBean.checkNotNull(loginModel.getLoginName(), "用户名不能为空");
|
||||
ValidatorBean.checkNotNull(loginModel.getLoginPwd(), "密码不能为空");
|
||||
|
||||
int sessionMode = RedisCacheTool.getSysConfigIntVal(CommonConstWords.CONFIG_SESSION_MODE, CommonConstWords.CONFIG_SESSION_MODE_DEFAULT);
|
||||
if (sessionMode != CommonEnumUtil.SESSION_MODE.SEIZE.getValue()) {
|
||||
AuthUtil.logout();
|
||||
}
|
||||
|
||||
SessionUser user = userService.queryUserLogin(
|
||||
loginModel.getLoginName().trim(),
|
||||
loginModel.getLoginPwd().trim(),
|
||||
loginModel.getLanguageCode(),
|
||||
loginService.getLoginPlatform(request).getValue(),
|
||||
loginModel.getDeviceId()
|
||||
);
|
||||
|
||||
String redisKey = CommonConstWords.USER_LOGIN_ERROR + "_" + user.getUser().getId();
|
||||
redisCore.deleteKey(redisKey);
|
||||
|
||||
result = new ResultBean(true, AuthUtil.getSession().getId().toString(), AuthUtil.getSessionUser());
|
||||
result.setUrl("/");
|
||||
|
||||
AuthUtil.setOrganize(user.getUser().getOrganize());
|
||||
return result;
|
||||
};
|
||||
}
|
||||
}
|
@ -0,0 +1,104 @@
|
||||
package cn.estsh.i3plus.core.apiservice.serviceimpl.base.login.strategy;
|
||||
|
||||
import cn.estsh.i3plus.core.api.iservice.base.ISystemLoginService;
|
||||
import cn.estsh.i3plus.core.api.iservice.base.ISystemLoginStrategyService;
|
||||
import cn.estsh.i3plus.core.api.iservice.busi.ILicenseClickService;
|
||||
import cn.estsh.i3plus.core.api.iservice.busi.ISysUserService;
|
||||
import cn.estsh.i3plus.platform.common.tool.ServletRequestTool;
|
||||
import cn.estsh.i3plus.platform.common.util.CommonConstWords;
|
||||
import cn.estsh.i3plus.platform.common.util.PlatformConstWords;
|
||||
import cn.estsh.i3plus.pojo.base.bean.BaseThreadLocal;
|
||||
import cn.estsh.i3plus.pojo.base.enumutil.CommonEnumUtil;
|
||||
import cn.estsh.i3plus.pojo.base.enumutil.ImppEnumUtil;
|
||||
import cn.estsh.i3plus.pojo.model.platform.SystemLoginModel;
|
||||
import cn.estsh.i3plus.pojo.platform.bean.SessionUser;
|
||||
import cn.estsh.impp.framework.boot.auth.AuthUtil;
|
||||
import cn.estsh.impp.framework.boot.util.ImppRedis;
|
||||
import cn.estsh.impp.framework.boot.util.RedisCacheTool;
|
||||
import cn.estsh.impp.framework.boot.util.ResultBean;
|
||||
import cn.estsh.impp.framework.boot.util.ValidatorBean;
|
||||
import lombok.extern.slf4j.Slf4j;
|
||||
import org.springframework.beans.factory.annotation.Autowired;
|
||||
import org.springframework.context.annotation.Lazy;
|
||||
import org.springframework.stereotype.Service;
|
||||
|
||||
import javax.annotation.Resource;
|
||||
import javax.servlet.http.HttpServletRequest;
|
||||
import java.util.Arrays;
|
||||
import java.util.function.BiFunction;
|
||||
|
||||
import static cn.estsh.i3plus.platform.common.util.CommonConstWords.DEFAULT_LANGUAGE;
|
||||
|
||||
/**
|
||||
* @author Wynne.Lu
|
||||
* @date 2021/1/18 上午10:53
|
||||
* @desc
|
||||
*/
|
||||
@Lazy
|
||||
@Slf4j
|
||||
@Service
|
||||
public class E9LoginStrategy implements ISystemLoginStrategyService {
|
||||
|
||||
@Resource(name = "redisCore")
|
||||
protected ImppRedis redisCore;
|
||||
|
||||
@Autowired
|
||||
private ILicenseClickService licenseClickService;
|
||||
|
||||
@Autowired
|
||||
private ISysUserService userService;
|
||||
|
||||
@Autowired
|
||||
private ISystemLoginService loginService;
|
||||
|
||||
@Override
|
||||
public BiFunction<HttpServletRequest, SystemLoginModel, ResultBean> login() {
|
||||
return (request, loginModel) -> {
|
||||
boolean isRequestFromSpecificIp = validateHost(request);
|
||||
if (!isRequestFromSpecificIp) {
|
||||
return ResultBean.fail("单点登录请求未从指定授权服务器发送,校验失败。");
|
||||
}
|
||||
licenseClickService.checkLicenseNumberLogin();
|
||||
ValidatorBean.checkNotNull(loginModel.getLanguageCode(), "语言不能为空");
|
||||
// TODO 后期移除,暂时用于避免自动登录后前台没有正确的传输组织代码信息
|
||||
if ("null".equals(loginModel.getLanguageCode())) {
|
||||
loginModel.setLanguageCode(DEFAULT_LANGUAGE);
|
||||
}
|
||||
|
||||
// 设置语言代码
|
||||
BaseThreadLocal.setData(BaseThreadLocal.LANGUAGE_CODE, loginModel.getLanguageCode());
|
||||
BaseThreadLocal.setData(PlatformConstWords.AUTH_REALM_CHOOSE, ImppEnumUtil.AUTH_REALM_STRATEGY.PANASONIC.getStrategyName());
|
||||
|
||||
int sessionMode = RedisCacheTool.getSysConfigIntVal(CommonConstWords.CONFIG_SESSION_MODE, CommonConstWords.CONFIG_SESSION_MODE_DEFAULT);
|
||||
if (sessionMode != CommonEnumUtil.SESSION_MODE.SEIZE.getValue()) {
|
||||
AuthUtil.logout();
|
||||
}
|
||||
|
||||
SessionUser user = userService.queryUserLogin(
|
||||
loginModel.getLoginName().trim(),
|
||||
loginModel.getLoginPwd() == null ? null : loginModel.getLoginPwd().trim(),
|
||||
loginModel.getLanguageCode(),
|
||||
loginService.getLoginPlatform(request).getValue(),
|
||||
loginModel.getDeviceId()
|
||||
);
|
||||
|
||||
String redisKey = CommonConstWords.USER_LOGIN_ERROR + "_" + user.getUser().getId();
|
||||
redisCore.deleteKey(redisKey);
|
||||
|
||||
ResultBean result = new ResultBean(true, AuthUtil.getSession().getId().toString(), AuthUtil.getSessionUser());
|
||||
result.setUrl("/");
|
||||
|
||||
AuthUtil.setOrganize(user.getUser().getOrganize());
|
||||
|
||||
return null;
|
||||
};
|
||||
}
|
||||
|
||||
private boolean validateHost(HttpServletRequest request) {
|
||||
final String delimiter = ",";
|
||||
String hostsConfig = RedisCacheTool.getSysConfigStrVal(PlatformConstWords.OSS_REQUEST_HOST);
|
||||
String[] hosts = hostsConfig.split(delimiter);
|
||||
String requestHost = ServletRequestTool.getRequestHost(request);
|
||||
return Arrays.stream(hosts).anyMatch(d -> requestHost.equals(d));
|
||||
}
|
||||
}
|
Loading…
Reference in New Issue