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
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; |
|
} |
|
|
|
}
|
|
|