You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
363 lines
13 KiB
363 lines
13 KiB
package com.eco.plugin.xx.stsxit.utils; |
|
|
|
import com.fr.base.ServerConfig; |
|
import com.fr.base.TableData; |
|
import com.fr.base.TemplateUtils; |
|
import com.fr.decision.authority.AuthorityContext; |
|
import com.fr.decision.authority.base.constant.type.operation.ManualOperationType; |
|
import com.fr.decision.authority.data.User; |
|
import com.fr.decision.base.util.UUIDUtil; |
|
import com.fr.decision.privilege.TransmissionTool; |
|
import com.fr.decision.privilege.encrpt.PasswordValidator; |
|
import com.fr.decision.webservice.bean.authentication.OriginUrlResponseBean; |
|
import com.fr.decision.webservice.interceptor.handler.ReportTemplateRequestChecker; |
|
import com.fr.decision.webservice.login.LogInOutResultInfo; |
|
import com.fr.decision.webservice.utils.DecisionServiceConstants; |
|
import com.fr.decision.webservice.utils.DecisionStatusService; |
|
import com.fr.decision.webservice.utils.UserSourceFactory; |
|
import com.fr.decision.webservice.v10.login.LoginService; |
|
import com.fr.decision.webservice.v10.login.event.LogInOutEvent; |
|
import com.fr.decision.webservice.v10.user.UserService; |
|
import com.fr.event.EventDispatcher; |
|
import com.fr.file.TableDataConfig; |
|
import com.fr.general.data.DataModel; |
|
import com.fr.json.JSONObject; |
|
import com.fr.log.FineLoggerFactory; |
|
import com.fr.script.Calculator; |
|
import com.fr.stable.StringUtils; |
|
import com.fr.stable.query.QueryFactory; |
|
import com.fr.stable.query.restriction.RestrictionFactory; |
|
import com.fr.third.springframework.web.method.HandlerMethod; |
|
import com.fr.web.controller.ReportRequestService; |
|
import com.fr.web.utils.WebUtils; |
|
|
|
import javax.servlet.http.Cookie; |
|
import javax.servlet.http.HttpServletRequest; |
|
import javax.servlet.http.HttpServletResponse; |
|
import javax.servlet.http.HttpSession; |
|
import java.io.IOException; |
|
import java.util.List; |
|
|
|
public class FRUtils { |
|
/** |
|
* 判断用户是否存在 |
|
* @param userName |
|
* @return |
|
*/ |
|
public static boolean isUserExist(String userName){ |
|
if (StringUtils.isEmpty(userName)) { |
|
return false; |
|
} else { |
|
try { |
|
List userList = AuthorityContext.getInstance().getUserController().find(QueryFactory.create().addRestriction(RestrictionFactory.eq("userName", userName))); |
|
return userList != null && !userList.isEmpty(); |
|
} catch (Exception e) { |
|
FineLoggerFactory.getLogger().error(e.getMessage()); |
|
return false; |
|
} |
|
} |
|
} |
|
|
|
/** |
|
* 判断是否登录FR |
|
* @param req |
|
* @return |
|
*/ |
|
public static boolean isLogin(HttpServletRequest req){ |
|
return LoginService.getInstance().isLogged(req); |
|
} |
|
|
|
/** |
|
* 帆软登录 |
|
* @param httpServletRequest |
|
* @param httpServletResponse |
|
* @param userName |
|
* @param url |
|
*/ |
|
public static void login(HttpServletRequest httpServletRequest,HttpServletResponse httpServletResponse,String userName,String url){ |
|
FineLoggerFactory.getLogger().info("FRLOG:用户名:"+userName+";跳转链接:"+url); |
|
|
|
//判断用户名是否为空 |
|
if(!Utils.isNullStr(userName)){ |
|
if(isUserExist(userName)){ |
|
try { |
|
LoginService.getInstance().login(httpServletRequest, httpServletResponse, userName); |
|
|
|
EventDispatcher.fire(LogInOutEvent.LOGIN,new LogInOutResultInfo(httpServletRequest,httpServletResponse,userName,true)); |
|
FineLoggerFactory.getLogger().info("FRLOG:登陆成功!"); |
|
|
|
if(!Utils.isNullStr(url)){ |
|
httpServletResponse.sendRedirect(url); |
|
} |
|
} catch (Exception e) { |
|
ResponseUtils.failedResponse(httpServletResponse,"登录异常,请联系管理员!"); |
|
FineLoggerFactory.getLogger().info("FRLOGException:"+e.getMessage()); |
|
} |
|
}else{ |
|
ResponseUtils.failedResponse(httpServletResponse,"用户在报表系统中不存在!"); |
|
} |
|
}else{ |
|
ResponseUtils.failedResponse(httpServletResponse,"用户名不能为空!"); |
|
} |
|
} |
|
|
|
/** |
|
* 帆软登录 |
|
* @param httpServletRequest |
|
* @param httpServletResponse |
|
* @param token |
|
* @param url |
|
*/ |
|
public static void loginByToken(HttpServletRequest httpServletRequest,HttpServletResponse httpServletResponse,String token,String url){ |
|
|
|
FineLoggerFactory.getLogger().info("FRLOG:token:"+token+";跳转链接:"+url); |
|
|
|
//判断用户名是否为空 |
|
if(!Utils.isNullStr(token)){ |
|
writeToken2Cookie(httpServletResponse,token,-1); |
|
|
|
HttpSession session = httpServletRequest.getSession(true); |
|
|
|
httpServletRequest.setAttribute(DecisionServiceConstants.FINE_AUTH_TOKEN_NAME,token); |
|
|
|
session.setAttribute(DecisionServiceConstants.FINE_AUTH_TOKEN_NAME, token); |
|
|
|
if(!Utils.isNullStr(url)){ |
|
try { |
|
httpServletResponse.sendRedirect(url); |
|
} catch (IOException e) { |
|
ResponseUtils.failedResponse(httpServletResponse,"跳转异常!"); |
|
} |
|
} |
|
}else{ |
|
ResponseUtils.failedResponse(httpServletResponse,"token不能为空!"); |
|
} |
|
} |
|
|
|
/** |
|
* 产品原始登录方法 |
|
* @param req |
|
* @param res |
|
* @param username |
|
* @return |
|
*/ |
|
public static JSONObject originLogin(HttpServletRequest req,HttpServletResponse res,String username){ |
|
// String password = param.getString("password"); |
|
// password = decryptFRPsd(password); |
|
|
|
FRUtils.FRLogInfo("originLogin:"+username); |
|
|
|
if(isUserExist(username)){ |
|
try { |
|
String token = LoginService.getInstance().login(req, res, username); |
|
JSONObject result = new JSONObject(); |
|
result.put("username",username); |
|
result.put("validity",-1); |
|
result.put("accessToken",token); |
|
result.put("username",username); |
|
result.put("url","/webroot/decision"); |
|
JSONObject originUrlResponse = new JSONObject(); |
|
originUrlResponse.put("originUrl","/webroot/decision"); |
|
originUrlResponse.put("method","GET"); |
|
originUrlResponse.put("parameters",new JSONObject()); |
|
result.put("originUrlResponse",originUrlResponse); |
|
return new JSONObject().put("data",result); |
|
} catch (Exception e) { |
|
ResponseUtils.failedResponse(res,"登录异常,请联系管理员!"); |
|
} |
|
}else{ |
|
ResponseUtils.failedResponse(res,"用户在报表系统中不存在!"); |
|
} |
|
|
|
return new JSONObject(); |
|
} |
|
|
|
/** |
|
* 获取token |
|
* @param httpServletRequest |
|
* @param httpServletResponse |
|
* @param username |
|
* @return |
|
*/ |
|
public static String getToken(HttpServletRequest httpServletRequest,HttpServletResponse httpServletResponse,String username){ |
|
String token = ""; |
|
try { |
|
token = LoginService.getInstance().login(httpServletRequest, httpServletResponse, username); |
|
} catch (Exception e) { |
|
FineLoggerFactory.getLogger().info("FRLOG:获取token失败"+e.getMessage()); |
|
} |
|
|
|
return token; |
|
} |
|
|
|
private static void writeToken2Cookie(HttpServletResponse req, String token, int num) { |
|
try { |
|
if (StringUtils.isNotEmpty(token)) { |
|
Cookie cookie = new Cookie("fine_auth_token", token); |
|
long maxAge = num == -2 ? 1209600000L : (long)num; |
|
cookie.setMaxAge((int)maxAge); |
|
cookie.setPath(ServerConfig.getInstance().getCookiePath()); |
|
req.addCookie(cookie); |
|
Cookie rememberCookie = new Cookie("fine_remember_login", String.valueOf(num == -2 ? -2 : -1)); |
|
rememberCookie.setMaxAge((int)maxAge); |
|
rememberCookie.setPath(ServerConfig.getInstance().getCookiePath()); |
|
req.addCookie(rememberCookie); |
|
} else { |
|
FineLoggerFactory.getLogger().error("empty token cannot save."); |
|
} |
|
} catch (Exception e) { |
|
FineLoggerFactory.getLogger().error(e.getMessage(), e); |
|
} |
|
|
|
} |
|
|
|
/** |
|
* 后台登出 |
|
* @param httpServletRequest |
|
* @param httpServletResponse |
|
*/ |
|
public static void logoutByToken(HttpServletRequest httpServletRequest,HttpServletResponse httpServletResponse,String token) |
|
{ |
|
httpServletRequest.setAttribute("fine_auth_token",token); |
|
logout(httpServletRequest,httpServletResponse); |
|
} |
|
|
|
/** |
|
* |
|
* @param httpServletRequest |
|
* @param httpServletResponse |
|
*/ |
|
public static void logout(HttpServletRequest httpServletRequest,HttpServletResponse httpServletResponse) |
|
{ |
|
if(!isLogin(httpServletRequest)){ |
|
return ; |
|
} |
|
|
|
try { |
|
LoginService.getInstance().logout(httpServletRequest,httpServletResponse); |
|
} catch (Exception e) { |
|
ResponseUtils.failedResponse(httpServletResponse,"登出异常,请联系管理员!"); |
|
FineLoggerFactory.getLogger().info("FRLOGException:"+e.getMessage()); |
|
} |
|
} |
|
|
|
/** |
|
* 打印FR日志 |
|
* @param message |
|
*/ |
|
public static void FRLogInfo(String message){ |
|
FineLoggerFactory.getLogger().info("FRLOG:"+message); |
|
} |
|
|
|
/** |
|
* 打印FR日志-error |
|
* @param message |
|
*/ |
|
public static void FRLogError(String message){ |
|
FineLoggerFactory.getLogger().error("FRLOG:"+message); |
|
} |
|
|
|
|
|
/** |
|
* 根据用户名获取用户信息 |
|
* @param userName |
|
* @return |
|
*/ |
|
public static User getFRUserByUserName(String userName){ |
|
try { |
|
return UserService.getInstance().getUserByUserName(userName); |
|
} catch (Exception e) { |
|
FRLogInfo("获取用户信息异常:"+e.getMessage()); |
|
} |
|
|
|
return null; |
|
} |
|
|
|
/** |
|
* 解密FR密码 |
|
* @param password |
|
* @return |
|
*/ |
|
public static String decryptFRPsd(String password){ |
|
FRLogInfo("解密密码:"+password); |
|
return TransmissionTool.decrypt(password); |
|
} |
|
|
|
/** |
|
* 根据明文密码生成数据库中的密码,用户密码校验用 |
|
* @return |
|
*/ |
|
public static String getDBPsd(String username,String password){ |
|
PasswordValidator pv = UserSourceFactory.getInstance().getUserSource(ManualOperationType.KEY).getPasswordValidator(); |
|
String uuid = UUIDUtil.generate(); |
|
|
|
return pv.encode(username, password, uuid); |
|
} |
|
|
|
/** |
|
* 获取带参数的访问链接 |
|
* @return |
|
*/ |
|
public static String getAllUrl(HttpServletRequest httpServletRequest){ |
|
return WebUtils.getOriginalURL(httpServletRequest); |
|
} |
|
|
|
/** |
|
* 根据originKey获取源链接 |
|
* @param req |
|
* @return |
|
* @throws Exception |
|
*/ |
|
public static String getOriginUrl(HttpServletRequest req) throws Exception { |
|
String origin = req.getParameter("origin"); |
|
if (StringUtils.isNotEmpty(origin)) { |
|
OriginUrlResponseBean originUrlResponseBean = (OriginUrlResponseBean) DecisionStatusService.originUrlStatusService().get(origin); |
|
DecisionStatusService.originUrlStatusService().delete(origin); |
|
if (originUrlResponseBean != null) { |
|
return originUrlResponseBean.getOriginUrl(); |
|
} |
|
} |
|
|
|
return new OriginUrlResponseBean(TemplateUtils.render("${fineServletURL}")).getOriginUrl(); |
|
} |
|
|
|
/** |
|
* 判断是否开启模板认证 |
|
* @param |
|
* @return |
|
* @throws Exception |
|
*/ |
|
public static boolean isTempAuth(HttpServletRequest req,HttpServletResponse res) throws Exception { |
|
ReportTemplateRequestChecker checker = new ReportTemplateRequestChecker(); |
|
HandlerMethod hm = new HandlerMethod(new ReportRequestService(),ReportRequestService.class.getMethod("preview", HttpServletRequest.class, HttpServletResponse.class, String.class)); |
|
return checker.checkRequest(req,res,hm); |
|
} |
|
|
|
/** |
|
* 获取数据集数据 |
|
* @param serverDataSetName |
|
* @return |
|
*/ |
|
public static DataModel getTableData(String serverDataSetName){ |
|
TableData userInfo = TableDataConfig.getInstance().getTableData(serverDataSetName); |
|
DataModel userInfoDM = userInfo.createDataModel(Calculator.createCalculator()); |
|
// userInfoDM.getRowCount(); |
|
// userInfoDM.getColumnIndex(); |
|
// userInfoDM.getValueAt() |
|
return userInfoDM; |
|
} |
|
|
|
public static String getIndex(HttpServletRequest req){ |
|
String url = req.getScheme()+"://"+req.getServerName()+":"+String.valueOf(req.getServerPort())+req.getRequestURI(); |
|
return url; |
|
} |
|
|
|
/** |
|
* 获取帆软域名 |
|
* @param req |
|
* @return |
|
*/ |
|
public static String getFRDomain(HttpServletRequest req){ |
|
return getAllUrl(req).split("/webroot")[0]; |
|
} |
|
}
|
|
|