IntelligentRecognition/ah-jjsp-service/.svn/pristine/4a/4ada9fec9ddda4c5e5f0722aa04...

442 lines
18 KiB
Plaintext
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

package com.securityControl.auth.controller;
import cn.hutool.core.lang.TypeReference;
import com.alibaba.fastjson2.JSONObject;
import com.google.common.collect.Maps;
import com.securityControl.auth.form.Aes;
import com.securityControl.auth.form.LoginBody;
import com.securityControl.auth.service.SysLoginService;
import com.securityControl.common.core.constant.SecurityConstants;
import com.securityControl.common.core.domain.R;
import com.securityControl.common.core.utils.JwtUtils;
import com.securityControl.common.core.utils.ServletUtils;
import com.securityControl.common.core.utils.StringUtils;
import com.securityControl.common.core.utils.aes.DateTimeHelper;
import com.securityControl.common.core.utils.aes.ListHelper;
import com.securityControl.common.core.utils.ip.IpUtils;
import com.securityControl.common.redis.service.RedisService;
import com.securityControl.common.security.auth.AuthUtil;
import com.securityControl.common.security.service.TokenService;
import com.securityControl.common.security.utils.SecurityUtils;
import com.securityControl.system.api.RemoteLogService;
import com.securityControl.system.api.domain.SysOperLog;
import com.securityControl.system.api.domain.SysUser;
import com.securityControl.system.api.domain.decision.IscMenu;
import com.securityControl.system.api.domain.decision.SysMenu;
import com.securityControl.system.api.model.LoginUser;
import com.sgcc.isc.core.orm.complex.FunctionNode;
import com.sgcc.isc.core.orm.complex.FunctionTree;
import com.sgcc.isc.core.orm.identity.User;
import com.sgcc.isc.core.orm.resource.Function;
import com.sgcc.isc.framework.common.constant.Constants;
import com.sgcc.isc.service.adapter.factory.AdapterFactory;
import com.sgcc.isc.service.adapter.helper.IIdentityService;
import com.sgcc.isc.service.adapter.helper.IResourceService;
import com.sgcc.isc.service.adapter.impl.ResourceService;
import com.sgcc.isc.ualogin.client.CASClient;
import com.sgcc.isc.ualogin.client.CASTicket;
import com.sgcc.isc.ualogin.client.IscServiceTicketValidator;
import com.sgcc.isc.ualogin.client.util.IscSSOResourceUtil;
import com.sgcc.isc.ualogin.client.vo.IscSSOUserBean;
import io.jsonwebtoken.Claims;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.client.RestTemplate;
import org.xml.sax.SAXException;
import test.org.jasig.cas.client.Base64Util;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.xml.parsers.ParserConfigurationException;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.lang.reflect.Member;
import java.net.URL;
import java.net.URLConnection;
import java.net.URLDecoder;
import java.net.URLEncoder;
import java.nio.charset.StandardCharsets;
import java.util.*;
/**
* token 控制
*
* @author czc
*/
@Api(tags = "系统登录")
@RestController
@Slf4j
public class TokenController {
@Autowired
private TokenService tokenService;
@Autowired
private RedisService redisUtil;
@Autowired
private SysLoginService sysLoginService;
@Autowired
private RemoteLogService remoteLogService;
private String[] userList={"wangzh0059","jysp","!jysp","ahsbd","weit0037","zhuy461x","wb_chennh0013","wb_guoc7712","lijf431X","wangyl253x","zhouxf8318","liurw0614","wb_zhux4635","liyy6816","bonus","!bns"};
/**
* 统一权限性能地址
*/
@Value("${isc.url_xn}")
private String url_xn;
@Value("${isc.appId}")
private String appId;
@Value("${isc.dateUrl}")
private String dateUrl;
@Value("${isc.dateLogin}")
private String dateLogin;
@Value("${isc.menu_url}")
private String menu_url;
@PostMapping("login")
public R<?> login(LoginBody form) {
form.setPassword(Aes.aesDecrypt(form.getPassword()));
form.setUsername(Aes.aesDecrypt(form.getUsername()));
Map<String,Object> map= iscLogin(form.getUsername(),form.getPassword());
String pwd=(String) map.get("pwd");
// List<SysMenu> menu= (List) map.get("menu");
String isL=map.get("isL").toString();//是否成功
if(getUserNoLj(form.getUsername())){//过滤账号不走isc
pwd=form.getPassword();
}
// pwd=form.getPassword();
List<SysMenu> menu=null;
LoginUser userInfo = sysLoginService.login(form.getUsername(), pwd,menu);
// 获取登录token
return R.ok(tokenService.createToken(userInfo));
}
//isc登录
public Map<String,Object> iscLogin(String username,String password){
Map<String,Object> map= Maps.newHashMap();
Boolean isLogin=false;
try{
if(StringUtils.isNotBlank(username) && StringUtils.isNotBlank(password)){
String server = url_xn + "/v1/tickets";
String service = dateLogin;
String pwd = new String(Base64Util.encode(password.getBytes("UTF-8")));
CASTicket ticket = CASClient.getTicket(server, username, pwd, service);
/* ticket校验器 */
IscServiceTicketValidator sv = new IscServiceTicketValidator();
/*统一认证服务端校验器地址*/
sv.setCasValidateUrl(dateUrl);
/*业务系统LoginModule访问地址*/
sv.setService(dateLogin);
/*设置Ticket*/
sv.setServiceTicket(ticket.getServiceTicket());
/*校验*/
sv.validate();
String user = "";
if (sv.isAuthenticationSuccesful()) {
user = sv.getUser();
} else {
String errorCode = sv.getErrorCode();
String errorMessage = sv.getErrorMessage();
System.out.println("errorInfo -----------> " + errorCode + "\r\n" + errorMessage);
}
IscSSOUserBean iscSSOUserBean = null;
/*获取当前用户登录信息*/
iscSSOUserBean = IscSSOResourceUtil.transferIscUserBean(user);
/*当前登录用户ID*/
String userid = iscSSOUserBean.getIscUserId();
/*当前登录用户账号*/
String loginName = iscSSOUserBean.getIscUserSourceId();
LoginUser loginUser = new LoginUser();
// sysUser.setMenus(getMenuList(userid));
List<SysMenu> list=getMenuList(userid);
map.put("menu",list);
map.put("isL","true");
map.put("pwd","jysp@Bns2023**");
map.put("loginName",loginName);
}
}catch (Exception e){
map.put("menu",new ArrayList<>());
map.put("isL","false");
map.put("pwd","1233");
map.put("loginName",username);
e.printStackTrace();
}
return map;
}
/**
* 不拦截用户
* @return
*/
public Boolean getUserNoLj(String userName){
return Arrays.asList(userList).contains(userName);
}
/**
* 本地推出登录
*
* @param request
* @return
*/
@PostMapping("logout")
public R<?> loginOut(HttpServletRequest request) {
String jwtToken = SecurityUtils.getToken(request);
Claims claims = JwtUtils.parseToken(jwtToken);
Integer userId = (Integer) claims.get(SecurityConstants.DETAILS_USER_ID);
String iscUser = (String) claims.get(SecurityConstants.DETAILS_ISC_USER_ID);
String userName = (String) claims.get(SecurityConstants.DETAILS_USERNAME);
redisUtil.delete("token:" + jwtToken);
redisUtil.delete("userId:" + userId);
redisUtil.delete("ISCUserId:" + iscUser);
redisUtil.delete("userName:" + userName);
return R.ok();
}
@PostMapping("refresh")
public R<?> refresh(HttpServletRequest request) {
/* String sessionConfigStr = (String) (new RestTemplate()).getForObject(url_aq + "/loadSessionPolicy" + "?appid=" + appId,
String.class, new Object[0]);
com.alibaba.fastjson2.JSONObject sessionInfo = com.alibaba.fastjson2.JSONObject.parseObject(sessionConfigStr);
*/ //刷新进行时间
String jwtToken = SecurityUtils.getToken(request);
Claims claims = JwtUtils.parseToken(jwtToken);
String userId = (String) claims.get(SecurityConstants.DETAILS_USER_ID);
String iscUser = (String) claims.get(SecurityConstants.DETAILS_ISC_USER_ID);
String userName = (String) claims.get(SecurityConstants.DETAILS_USERNAME);
Integer times = 60 * 30;
/* if (sessionInfo.containsKey("sessionTimeout")) {
Integer sessionTimeout = sessionInfo.getInteger("sessionTimeout") / 60;
times = sessionInfo.getInteger("sessionTimeout");
}*/
redisUtil.set("token:" + jwtToken, jwtToken, times);
redisUtil.set("userId::" + userId, jwtToken, times);
redisUtil.set("ISCUserId:" + jwtToken, iscUser, times);
redisUtil.set("userName:" + jwtToken, userName, times);
LoginUser loginUser = tokenService.getLoginUser(request);
if (StringUtils.isNotNull(loginUser)) {
// 刷新令牌有效期
tokenService.refreshToken(loginUser);
return R.ok();
}
return R.ok();
}
@ApiOperation(value = "3.0根据统一权限获取人员基本信息")
@GetMapping("getUserTicket")
public R<?> getUserTicketPlus(HttpServletRequest request, HttpServletResponse response) throws Exception {
IscSSOUserBean userbean = IscSSOResourceUtil.getIscUserBean(request);
String ticket = request.getParameter("ticket");
System.out.println("ticket -----------> " + ticket);
if(StringUtils.isNotNull(userbean)) {
System.out.println("userbean -----------> iscId= " + userbean.getIscUserId());
}
/* *//*判断ticket是否存在不存在重定向到统一认证客户端*//*
if (null == request.getParameter("ticket") || "".equals(request.getParameter("ticket"))) {
*//*重定向到统一认证服务端service参数是业务系统LoginModule请求地址*//*
response.sendRedirect(dateLogin + "?service=http://127.0.0.1:8082/sap_sso/login");
return R.ok();
}*/
/* ticket校验器 */
IscServiceTicketValidator sv = new IscServiceTicketValidator();
System.out.println("tick校验器 dateUrl >>>>>>>>>>>> " + dateUrl);
/*统一认证服务端校验器地址*/
sv.setCasValidateUrl(dateUrl);
System.out.println("tick校验器 dateLogin >>>>>>>>>>>> " + dateLogin);
/*业务系统LoginModule访问地址*/
sv.setService(dateLogin);
/*设置Ticket*/
sv.setServiceTicket(request.getParameter("ticket"));
/*校验*/
try {
sv.validate();
} catch (SAXException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (ParserConfigurationException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
String user = "";
if (sv.isAuthenticationSuccesful()) {
user = sv.getUser();
} else {
String errorCode = sv.getErrorCode();
String errorMessage = sv.getErrorMessage();
/* handle the error */
System.out.println("errorInfo -----------> " + errorCode + "\r\n" + errorMessage);
}
System.out.println("tick校验器 userinfo >>>>>>>>>>>> " + user);
IscSSOUserBean iscSSOUserBean = null;
try {
/*获取当前用户登录信息*/
iscSSOUserBean = IscSSOResourceUtil.transferIscUserBean(user);
/*当前登录用户ID*/
String userid = iscSSOUserBean.getIscUserId();
System.out.println(userid);
/*当前登录用户账号*/
String loginName = iscSSOUserBean.getIscUserSourceId();
System.out.println("当前登录用户名:"+loginName);
LoginUser loginUser = new LoginUser();
SysUser sysUser = new SysUser();
sysUser.setMenus(getMenuList(userid));
loginUser.setSysUser(sysUser);
loginUser.getSysUser().setRoleId(3L);
loginUser.getSysUser().setRoleName("继远管理员");
loginUser.getSysUser().setOrgName("建设分公司");
loginUser.getSysUser().setOrgId("***12Z0");
loginUser.getSysUser().setUserId(2L);
loginUser.getSysUser().setIsSup("1");
loginUser.getSysUser().setUserName(loginName);
loginUser.getSysUser().setIscUserId(userid);
String pers = "sys:violationStatistics:add,sys:violationStatistics:setVoiType,team:dev:detail,team:dev:edit,sys:dev:add," +
"sys:dev:edit,sys:dev:del,sys:dev:exp,sys:type:add,sys:type:edit,sys:type:del,sys:user:add," +
"sys:user:pwd,sys:user:edit,sys:user:del,sys:role:add,sys:role:edit,sys:role:aux,sys:role:del," +
"sys:menu:add,sys:menu:edit,sys:menu:del,sys:dict:add,sys:dict:edit,sys:dict:del";
String[] persArr = pers.split(",");
List<String> persList = Arrays.asList(persArr);
HashSet<String> hashSet = new HashSet<>(persList);
loginUser.setPermissions(hashSet);
loginUser.getSysUser().setPers(persList);
Map<String, Object> resultMap = tokenService.createToken(loginUser);
//添加登录日志
addLoginLog(loginName, "用户登录", "系统登录", "com.securityControl.auth.controller.getUserTicket()", "/auth/getUserTicket");
return R.ok(resultMap);
} catch (Exception e) {
log.error(e.toString(),e);
// TODO Auto-generated catch block
e.printStackTrace();
}
return R.ok();
}
public static void main(String[] args) {
IResourceService service = (IResourceService) AdapterFactory.getInstance(Constants.CLASS_RESOURCE);
System.out.println("IscMenu 请求路径-----------------01------------------------------------------------------>service");
}
private List<SysMenu> getMenuList(String userId){
List<SysMenu> menuList=new ArrayList<>();
System.out.println("IscMenu 请求路径----------->"+menu_url + "/userResource/all/" + userId+"/"+appId);
String data = (String) (new RestTemplate()).getForObject(menu_url + "/userResource/all/" + userId+"/"+appId,
String.class, new Object[0]);
System.out.println("IscMenu 菜单数据----------->"+data);
try{
com.alibaba.fastjson2.JSONObject obj = com.alibaba.fastjson2.JSONObject.parseObject(data);
com.alibaba.fastjson2.JSONArray jsonArray=obj.getJSONArray("data");
List<IscMenu> list= jsonArray.toList(IscMenu.class);
getChilderList(menuList,list);
}catch (Exception e){
log.error(e.toString(),e);
e.printStackTrace();
}
return menuList;
}
private static void getChilderList(List<SysMenu> menuList, List<IscMenu> iscList){
try{
for (IscMenu isc: iscList) {
if(StringUtils.isEmpty(isc.getParentId())){//没有上级节点的为父节点
SysMenu menu=new SysMenu();
menu.setMenuId(isc.getId());
menu.setMenuName(isc.getName());
menu.setUrl(isc.getConent());
menu.setLast(false);
getChilderList2(menu,iscList);
if("Y".equals(isc.getStatus())){
menuList.add(menu);
}
}
}
}catch (Exception e){
log.error(e.toString(),e);
}
}
private static void getChilderList2(SysMenu sysMenu,List<IscMenu> iscLis){
List<SysMenu> childer=new ArrayList<>();
for (IscMenu isc:iscLis) {
if(StringUtils.isNotEmpty(sysMenu.getMenuId())){
if (sysMenu.getMenuId().equals(isc.getParentId())){
SysMenu menu=new SysMenu();
menu.setMenuId(isc.getId());
menu.setMenuName(isc.getName());
menu.setUrl(isc.getConent());
menu.setLast(true);
if("Y".equals(isc.getStatus())){
childer.add(menu);
}
}
}
}
if(ListHelper.isEmpty(childer)){
sysMenu.setLast(true);
}else{
sysMenu.setLast(false);
sysMenu.setChilder(childer );
}
}
/**
* 记录登录信息
*
* @param username 用户名
* @param title 标题
* @param detail 详情
* @return
*/
public void addLoginLog(String username, String title, String detail, String method, String url) {
SysOperLog sysOperLog = new SysOperLog();
sysOperLog.setGrade(title);
sysOperLog.setTimes(DateTimeHelper.getNowTime());
sysOperLog.setOperName(username);
String roleName = "继远管理员";
String deptName = "";
LoginUser loginUser = SecurityUtils.getLoginUser();
if (null != loginUser && null != loginUser.getSysUser()) {
SysUser sysUser = loginUser.getSysUser();
roleName = sysUser.getRoleName();
deptName = sysUser.getOrgName();
}
sysOperLog.setRoleName(roleName);
sysOperLog.setDeptName(deptName);
sysOperLog.setOperIp(IpUtils.getIpAddr(ServletUtils.getRequest()));
sysOperLog.setTitle(title);
sysOperLog.setRequestMethod("POST");
sysOperLog.setMethod(method);
sysOperLog.setBusinessType(0);
sysOperLog.setOperUrl(url);
sysOperLog.setOperParam(username);
sysOperLog.setDetail(detail);
sysOperLog.setLogType("系统日志");
sysOperLog.setSysMenu("");
remoteLogService.saveLogs(sysOperLog, SecurityConstants.INNER);
}
}