@Slf4j
public class SessionInterceptor implements HandlerInterceptor {
@Value("${username}")
private String username;
@Value("${domain}")
private String domain;
@Autowired
private MockService mockService;
@Autowired
private StaffService staffService;
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
// 鉴权规则匹配
loginMatch(request, response, handler);
return true;
}
private void loginMatch(HttpServletRequest request, HttpServletResponse response, Object handler) {
// HandlerMethod handlerMethod = (HandlerMethod) handler;
// Method method = handlerMethod.getMethod();
// 目前只支持 SSO 登陆
useSSOCheck(request, response);
}
/**
* 使用sso验证的逻辑
*
* @param request
*/
private void useSSOCheck(HttpServletRequest request, HttpServletResponse response) {
// 获取cookie
CookieUtil.setCookieDomain(domain);
String ldap = CookieUtil.getCookieValue(request, kylinUsername);
String remoteHost = request.getRemoteHost();
// if (StringUtils.equalsAny(remoteHost, "127.0.0.1", "localhost")) {
// ldap = "snailzhangqiushi";
// }
if (StringUtils.isBlank(ldap)) {
BusinessException.throwFrom(MsgCode.COOKIE_ERROR);
}
UserInfoHolder.setOriginUser(ldap);
log.info("cookie user ldap:{}", ldap);
// 从redis中查找mock的用户
ldap = mockService.getMockOfRedis(ldap);
log.info("user after mock :{}", ldap);
// 从员工中心获取用户信息
Staff staff = staffService.getStaffInfoByLdap(ldap);
if (Objects.isNull(staff)) {
log.error("未获取到用户信息, ldap:{}", ldap);
BusinessException.throwFrom(MsgCode.EMPLOYEE_REMOTE_FAIL);
}
StaffInfo staffInfo = DomainOrikaUtil.convert(staff, StaffInfo.class);
UserInfoHolder.setUserInfo(staffInfo);
}
@Override
public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
// 请求完成后删除
UserInfoHolder.removeUserInfo();
}
@Override
public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception e) throws Exception {
}
}
地基代码——SSO
于 2022-07-18 16:24:56 首次发布