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.
 
 
 

138 lines
5.3 KiB

package com.fr.plugin.oauth;
import com.fr.data.NetworkHelper;
import com.fr.decision.fun.impl.AbstractGlobalRequestFilterProvider;
import com.fr.decision.mobile.terminal.TerminalHandler;
import com.fr.decision.webservice.bean.authentication.LoginClientBean;
import com.fr.decision.webservice.v10.login.LoginService;
import com.fr.decision.webservice.v10.login.TokenResource;
import com.fr.io.utils.ResourceIOUtils;
import com.fr.log.FineLoggerFactory;
import com.fr.plugin.oauth.utils.HtmlUtils;
import com.fr.plugin.oauth.utils.RedirectUtils;
import com.fr.plugin.transform.ExecuteFunctionRecord;
import com.fr.plugin.transform.FunctionRecorder;
import com.fr.stable.StringUtils;
import com.fr.web.utils.WebUtils;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.ServletException;
import javax.servlet.http.Cookie;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.io.InputStream;
import java.io.UnsupportedEncodingException;
import java.net.URLDecoder;
import java.net.URLEncoder;
import java.util.Collection;
import java.util.HashMap;
import java.util.Properties;
@FunctionRecorder
public class LoginFilter extends AbstractGlobalRequestFilterProvider {
private static final String API_AUTHORIZE = "%s/idp/authCenter/authenticate?redirect_uri=%s&client_id=%s&response_type=code&state=123";
private static final String REDIRECT_URI = "/plugin/public/com.fr.plugin.xx/authLogin";
@Override
public void init(FilterConfig filterConfig) {
W2Config.getInstance();
super.init(filterConfig);
}
@Override
public String filterName() {
return "loginFilter";
}
@ExecuteFunctionRecord
@Override
public String[] urlPatterns() {
return new String[]{
"/decision/login",
"/login.html",
"/decision/view/form"
};
}
private static final String ADMIN = "admin";
private static final String VIEWLET_DIRECT = "B2B/sell_in";
private static final String VIEWLET_DIRECT2 = "B2B%2Fsell_in";
private static final String VIEWLET_DIRECT3 = "B2B%252Fsell_in";
@Override
public void doFilter(HttpServletRequest req, HttpServletResponse res, FilterChain filterChain) {
try {
LoginClientBean bean = isLogined(req);
boolean isForm = req.getRequestURI().endsWith("view/form");
if (bean == null) {
boolean redirect = false;
if (isForm) {
String viewlet = req.getParameter("viewlet");
redirect = StringUtils.isNotBlank(viewlet) ?
(viewlet.startsWith(VIEWLET_DIRECT) || viewlet.startsWith(VIEWLET_DIRECT2) || viewlet.startsWith(VIEWLET_DIRECT3)) : false;
} else {
String queryString = req.getQueryString();
boolean isAdmin = StringUtils.isNotBlank(queryString) ? ADMIN.equalsIgnoreCase(queryString) : false;
redirect = req.getMethod().equals("GET") && !isAdmin;
}
if (redirect) {
getAuthorizeCode(req, res, isForm);
return;
}
} else if (!isForm) {
// 登录成功,跳转至报表管理平台
RedirectUtils.redirect(bean.getUsername(), W2Config.getInstance(), bean.getToken(), res);
return;
}
/*res.setHeader("Content-type", "text/html;charset=UTF-8");
res.setCharacterEncoding("UTF-8");
res.getWriter().write("该账号已经登录!");*/
filterChain.doFilter(req, res);
} catch (Exception e) {
FineLoggerFactory.getLogger().error(e.getMessage());
}
}
public static void getAuthorizeCode(HttpServletRequest req, HttpServletResponse res, boolean isForm) throws UnsupportedEncodingException {
W2Config w2Config = W2Config.getInstance();
String callBack = URLEncoder.encode(w2Config.getFrurl() + REDIRECT_URI, "UTF-8");
if (isForm) {
callBack = URLEncoder.encode(w2Config.getFrurl() + REDIRECT_URI + "?form=" + getUrl(req), "UTF-8");
}
String url = String.format(API_AUTHORIZE, w2Config.getIdf(), callBack, w2Config.getOwclientId());
HtmlUtils.sendRedirect("", url, res);
}
private LoginClientBean isLogined(HttpServletRequest req) {
LoginClientBean bean = null;
try {
String token = TokenResource.COOKIE.getToken(req);
bean = LoginService.getInstance().loginStatusValid(token, TerminalHandler.getTerminal(req, NetworkHelper.getDevice(req)));
} catch (Exception var4) {
bean = null;
}
return bean;
}
private static String getUrl(HttpServletRequest request) {
String url = request.getRequestURL().toString();
String param = request.getQueryString();
if (StringUtils.isNotBlank(param)) {
try {
if (request.getCharacterEncoding() != null) {
param = URLDecoder.decode(param, request.getCharacterEncoding());
}
} catch (Exception e) {
FineLoggerFactory.getLogger().error(e.getMessage());
}
url = url + "?" + param;
}
return url;
}
}