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.
 
 

193 lines
6.8 KiB

package com.fr.plugin;
import com.fanruan.api.net.http.HttpKit;
import com.fr.decision.fun.impl.AbstractGlobalRequestFilterProvider;
import com.fr.decision.webservice.v10.login.LoginService;
import com.fr.general.ComparatorUtils;
import com.fr.json.JSONObject;
import com.fr.log.FineLoggerFactory;
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.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.io.PrintWriter;
import java.io.StringWriter;
import java.net.URLEncoder;
import java.nio.charset.StandardCharsets;
import java.util.HashMap;
@FunctionRecorder(localeKey = "zyfilter")
public class PLLoginFilter extends AbstractGlobalRequestFilterProvider {
@Override
public String filterName() {
return "ffrrww";
}
@Override
public String[] urlPatterns() {
return new String[]{
"/decision/login"
};
}
@Override
public void init(FilterConfig filterConfig) {
super.init(filterConfig);
}
@Override
public void doFilter(HttpServletRequest request, HttpServletResponse httpServletResponse, FilterChain filterChain) {
try {
if (request.getMethod().equals("GET")) {
String isAdmin = request.getParameter("isAdmin");
if (ComparatorUtils.equals(isAdmin, "1")) {
filterChain.doFilter(request, httpServletResponse);
return;
}
FineLoggerFactory.getLogger().info("来源:{}访问了登陆",request.getHeader("referer"));
sendRedirect(httpServletResponse, getCodeUrl(request));
} else {
filterChain.doFilter(request, httpServletResponse);
}
} catch (IOException e) {
printException2FrLog(e);
} catch (ServletException e) {
printException2FrLog(e);
} catch (Exception e) {
e.printStackTrace();
}
}
private String getCodeUrl(HttpServletRequest req) throws Exception {
ZtgtConfig plConfig = ZtgtConfig.getInstance();
String baseUrl = plConfig.getValAddr();
String clientId = plConfig.getAppId();
String redirect_uri = URLEncoder.encode(plConfig.getFrUrl(), "UTF-8");
String originalURL = URLEncoder.encode(WebUtils.getOriginalURL(req), StandardCharsets.UTF_8.name());
return baseUrl + "/authorize?response_type=code&client_id=" + clientId + "&state=xplatform&redirect_uri=" + redirect_uri + "&oauth_timestamp=" + System.currentTimeMillis() + "&target_uri=" + originalURL;
}
private String getUsername(String code) {
Token token = getAccessToken(code);
ZtgtConfig plConfig = ZtgtConfig.getInstance();
String baseUrl = plConfig.getValAddr();
String clientId = plConfig.getAppId();
String clientSecret = plConfig.getClientSecret();
String url = baseUrl + "/profile?access_token=" + token.getContent() + "&client_id=" + clientId + "&client_secret=" + clientSecret + "&oauth_timestamp=" + System.currentTimeMillis();
try {
String s = HttpKit.get(url);
JSONObject jsonObject = new JSONObject(s);
return jsonObject.getString("id");
} catch (Exception e) {
}
return StringUtils.EMPTY;
}
private synchronized Token getAccessToken(String code) {
try {
token = getNewToken(code);
} catch (Exception e) {
}
return token;
}
private static Token token = null;
private class Token {
private String content = StringUtils.EMPTY;
private long expires_in = 0L;
private long timestamp = 0L;
public Token(String content, long expires_in) {
Token.this.content = content;
Token.this.expires_in = expires_in;
Token.this.timestamp = System.currentTimeMillis();
}
public String getContent() {
return content;
}
public long getExpiresIn() {
return expires_in;
}
public boolean isTimeout() {
//考虑到网络传输,有效期我们只算90%
return System.currentTimeMillis() - timestamp > expires_in * 900;
}
public boolean needRefresh() {
//在70%到90%有效期期间进行刷新
return System.currentTimeMillis() - timestamp > expires_in * 700;
}
}
private Token getNewToken(String code) throws Exception {
ZtgtConfig plConfig = ZtgtConfig.getInstance();
String baseUrl = plConfig.getValAddr();
String clientId = plConfig.getAppId();
String redirect_uri = URLEncoder.encode(plConfig.getFrUrl(), "UTF-8");
String clientSecret = plConfig.getClientSecret();
String url = baseUrl + "/accessToken?client_id=" + clientId + "&client_secret=" + clientSecret + "&grant_type=authorization_code&code=" + code + "&redirect_uri=" + redirect_uri;
String res = HttpKit.post(url, new HashMap<>());
if (StringUtils.isEmpty(res)) {
return null;
}
return parseToken(res);
}
private Token parseToken(String res) throws Exception {
JSONObject entries = new JSONObject(res);
String access_token = entries.getString("access_token");
return new Token(access_token, -1);
}
public static void printException2FrLog(Throwable e) {
StringWriter writer = new StringWriter();
e.printStackTrace(new PrintWriter(writer));
String s = writer.toString();
FineLoggerFactory.getLogger().error("错误:{}", s);
}
private void sendRedirect(HttpServletResponse res, String url) {
res.setStatus(HttpServletResponse.SC_MOVED_TEMPORARILY);
res.setHeader("Location", url);
}
private void login(HttpServletRequest req, HttpServletResponse res, String username) {
String token = null;
try {
token = LoginService.getInstance().login(req, res, username);
req.setAttribute("fine_auth_token", token);
FineLoggerFactory.getLogger().error("login success");
} catch (Exception e) {
FineLoggerFactory.getLogger().error(e.getMessage(), e);
FineLoggerFactory.getLogger().error("login failed");
}
}
private void writerOurError(HttpServletResponse httpServletResponse) {
try {
WebUtils.writeOutTemplate("/com/fr/plugin/error.html", httpServletResponse, new HashMap());
} catch (IOException e) {
e.printStackTrace();
}
}
private boolean isLogin(HttpServletRequest req) {
return LoginService.getInstance().isLogged(req);
}
}