pioneer
2 years ago
commit
a2e95938c0
9 changed files with 282 additions and 0 deletions
@ -0,0 +1,6 @@ |
|||||||
|
# open-JSD-10110 |
||||||
|
|
||||||
|
JSD-10110 单点集成\ |
||||||
|
免责说明:该源码为第三方爱好者提供,不保证源码和方案的可靠性,也不提供任何形式的源码教学指导和协助!\ |
||||||
|
仅作为开发者学习参考使用!禁止用于任何商业用途!\ |
||||||
|
为保护开发者隐私,开发者信息已隐去!若原开发者希望公开自己的信息,可联系【pioneer】处理。 |
Binary file not shown.
@ -0,0 +1,23 @@ |
|||||||
|
<?xml version="1.0" encoding="UTF-8" standalone="no"?> |
||||||
|
<plugin> |
||||||
|
<id>com.eco.plugin.xx.newlan</id> |
||||||
|
<name><![CDATA[新蓝信单点]]></name> |
||||||
|
<active>yes</active> |
||||||
|
<version>1.0.4</version> |
||||||
|
<env-version>10.0</env-version> |
||||||
|
<jartime>2021-02-10</jartime> |
||||||
|
<vendor>fr.open</vendor> |
||||||
|
<main-package>com.fr.plugin</main-package> |
||||||
|
<!--用来记录这个任务的创建时间--> |
||||||
|
<description><![CDATA[ |
||||||
|
|
||||||
|
]]></description> |
||||||
|
<!--任务ID: 10110--> |
||||||
|
<create-day>2022-5-21 21:46:43</create-day> |
||||||
|
<extra-decision> |
||||||
|
<HttpHandlerProvider class="com.fr.plugin.http.NEWLANHttpHandler"/> |
||||||
|
<URLAliasProvider class="com.fr.plugin.http.NEWLANUrlAliasProvider"/> |
||||||
|
</extra-decision> |
||||||
|
<lifecycle-monitor class="com.fr.plugin.NEWLANLifeCycleMonitor"/> |
||||||
|
<function-recorder class="com.fr.plugin.FunctionRecoder"/> |
||||||
|
</plugin> |
@ -0,0 +1,12 @@ |
|||||||
|
package com.fr.plugin; |
||||||
|
|
||||||
|
import com.fr.plugin.transform.ExecuteFunctionRecord; |
||||||
|
import com.fr.plugin.transform.FunctionRecorder; |
||||||
|
|
||||||
|
@FunctionRecorder |
||||||
|
public class FunctionRecoder { |
||||||
|
@ExecuteFunctionRecord |
||||||
|
public void exe(){ |
||||||
|
System.out.println("插件功能埋点,虽然不会执行,除非上架应用"); |
||||||
|
} |
||||||
|
} |
@ -0,0 +1,60 @@ |
|||||||
|
package com.fr.plugin; |
||||||
|
|
||||||
|
import com.fr.config.*; |
||||||
|
import com.fr.config.holder.Conf; |
||||||
|
import com.fr.config.holder.factory.Holders; |
||||||
|
|
||||||
|
@Visualization(category = "新xx单点配置") |
||||||
|
public class NEWLANConfig extends DefaultConfiguration { |
||||||
|
|
||||||
|
private static volatile NEWLANConfig config = null; |
||||||
|
|
||||||
|
public static NEWLANConfig getInstance() { |
||||||
|
if (config == null) { |
||||||
|
config = ConfigContext.getConfigInstance(NEWLANConfig.class); |
||||||
|
} |
||||||
|
return config; |
||||||
|
} |
||||||
|
@Identifier(value = "apiUrl", name = "xx接口地址", description = "xx接口地址", status = Status.SHOW) |
||||||
|
private Conf<String> apiUrl = Holders.simple(""); |
||||||
|
@Identifier(value = "clientId", name = "clientId", description = "clientId", status = Status.SHOW) |
||||||
|
private Conf<String> clientId = Holders.simple(""); |
||||||
|
@Identifier(value = "clientSecret", name = "clientSecret", description = "描述", status = Status.SHOW) |
||||||
|
private Conf<String> clientSecret = Holders.simple(""); |
||||||
|
@Identifier(value = "authUrl", name = "xx认证域名", description = "xx接口地址", status = Status.SHOW) |
||||||
|
private Conf<String> authUrl = Holders.simple(""); |
||||||
|
public String getApiUrl() { |
||||||
|
return apiUrl.get(); |
||||||
|
} |
||||||
|
public void setApiUrl(String apiUrl) { |
||||||
|
this.apiUrl.set(apiUrl); |
||||||
|
} |
||||||
|
public String getClientId() { |
||||||
|
return clientId.get(); |
||||||
|
} |
||||||
|
public void setClientId(String clientId) { |
||||||
|
this.clientId.set(clientId); |
||||||
|
} |
||||||
|
public String getClientSecret() { |
||||||
|
return clientSecret.get(); |
||||||
|
} |
||||||
|
public void setClientSecret(String configName) { |
||||||
|
this.clientSecret.set(configName); |
||||||
|
} |
||||||
|
public String getAuthUrl() { |
||||||
|
return authUrl.get(); |
||||||
|
} |
||||||
|
public void setAuthUrl(String authUrl) { |
||||||
|
this.authUrl.set(authUrl); |
||||||
|
} |
||||||
|
@Override |
||||||
|
public Object clone() throws CloneNotSupportedException { |
||||||
|
NEWLANConfig cloned = (NEWLANConfig) super.clone(); |
||||||
|
cloned.apiUrl = (Conf<String>) this.apiUrl.clone(); |
||||||
|
cloned.clientId = (Conf<String>) this.clientId.clone(); |
||||||
|
cloned.clientSecret = (Conf<String>) this.clientSecret.clone(); |
||||||
|
cloned.authUrl = (Conf<String>) this.authUrl.clone(); |
||||||
|
return cloned; |
||||||
|
} |
||||||
|
|
||||||
|
} |
@ -0,0 +1,18 @@ |
|||||||
|
package com.fr.plugin; |
||||||
|
|
||||||
|
import com.fr.plugin.context.PluginContext; |
||||||
|
import com.fr.plugin.observer.inner.AbstractPluginLifecycleMonitor; |
||||||
|
import com.fr.stable.fun.Authorize; |
||||||
|
|
||||||
|
@Authorize |
||||||
|
public class NEWLANLifeCycleMonitor extends AbstractPluginLifecycleMonitor { |
||||||
|
@Override |
||||||
|
public void afterRun(PluginContext pluginContext) { |
||||||
|
NEWLANConfig.getInstance(); |
||||||
|
} |
||||||
|
|
||||||
|
@Override |
||||||
|
public void beforeStop(PluginContext pluginContext) { |
||||||
|
|
||||||
|
} |
||||||
|
} |
@ -0,0 +1,16 @@ |
|||||||
|
package com.fr.plugin.http; |
||||||
|
|
||||||
|
import com.fr.decision.fun.HttpHandler; |
||||||
|
import com.fr.decision.fun.impl.AbstractHttpHandlerProvider; |
||||||
|
import com.fr.plugin.http.handler.*; |
||||||
|
|
||||||
|
public class NEWLANHttpHandler extends AbstractHttpHandlerProvider { |
||||||
|
HttpHandler[] actions = new HttpHandler[]{ |
||||||
|
new ALLLan_login1Handler(), |
||||||
|
}; |
||||||
|
|
||||||
|
@Override |
||||||
|
public HttpHandler[] registerHandlers() { |
||||||
|
return actions; |
||||||
|
} |
||||||
|
} |
@ -0,0 +1,14 @@ |
|||||||
|
package com.fr.plugin.http; |
||||||
|
|
||||||
|
import com.fr.decision.fun.impl.AbstractURLAliasProvider; |
||||||
|
import com.fr.decision.webservice.url.alias.URLAlias; |
||||||
|
import com.fr.decision.webservice.url.alias.URLAliasFactory; |
||||||
|
|
||||||
|
public class NEWLANUrlAliasProvider extends AbstractURLAliasProvider { |
||||||
|
@Override |
||||||
|
public URLAlias[] registerAlias() { |
||||||
|
return new URLAlias[]{ |
||||||
|
URLAliasFactory.createPluginAlias("/lan_login", "/lan_login", true), |
||||||
|
}; |
||||||
|
} |
||||||
|
} |
@ -0,0 +1,133 @@ |
|||||||
|
package com.fr.plugin.http.handler; |
||||||
|
|
||||||
|
import com.fanruan.api.log.LogKit; |
||||||
|
import com.fanruan.api.net.http.HttpKit; |
||||||
|
import com.fr.base.TemplateUtils; |
||||||
|
import com.fr.data.NetworkHelper; |
||||||
|
import com.fr.decision.authority.data.User; |
||||||
|
import com.fr.decision.fun.impl.BaseHttpHandler; |
||||||
|
import com.fr.decision.webservice.v10.login.LoginService; |
||||||
|
import com.fr.decision.webservice.v10.user.UserService; |
||||||
|
import com.fr.json.JSONObject; |
||||||
|
import com.fr.log.FineLoggerFactory; |
||||||
|
import com.fr.plugin.NEWLANConfig; |
||||||
|
import com.fr.stable.StringUtils; |
||||||
|
import com.fr.third.springframework.web.bind.annotation.RequestMethod; |
||||||
|
import com.fr.web.utils.WebUtils; |
||||||
|
import javax.servlet.http.HttpServletRequest; |
||||||
|
import javax.servlet.http.HttpServletResponse; |
||||||
|
import java.io.IOException; |
||||||
|
import java.util.UUID; |
||||||
|
|
||||||
|
public class ALLLan_login1Handler extends BaseHttpHandler { |
||||||
|
@Override |
||||||
|
public RequestMethod getMethod() { |
||||||
|
return null; |
||||||
|
} |
||||||
|
|
||||||
|
@Override |
||||||
|
public String getPath() { |
||||||
|
return "/lan_login"; |
||||||
|
} |
||||||
|
|
||||||
|
@Override |
||||||
|
public boolean isPublic() { |
||||||
|
return true; |
||||||
|
} |
||||||
|
|
||||||
|
@Override |
||||||
|
public void handle(HttpServletRequest req, HttpServletResponse res) throws Exception { |
||||||
|
String code = req.getParameter("code"); |
||||||
|
NEWLANConfig config = NEWLANConfig.getInstance(); |
||||||
|
if (StringUtils.isBlank(code)) { |
||||||
|
String state= UUID.randomUUID().toString(); |
||||||
|
String originalURL = WebUtils.getOriginalURL(req); |
||||||
|
String url =String.format("%s/oauth2/authorize?appid=%s&response_type=code&scope=basic_userinfor&state=%s&redirect_uri=%s",config.getAuthUrl(),config.getClientId(),state,originalURL); |
||||||
|
sendRedirect(res, url); |
||||||
|
return; |
||||||
|
} |
||||||
|
String appToken = getAppToken(); |
||||||
|
String userToken = getUserToken(appToken, code, WebUtils.getOriginalURL(req)); |
||||||
|
String userInfo = getUserInfo(appToken, userToken); |
||||||
|
UserService userService = UserService.getInstance(); |
||||||
|
User user = userService.getUserByUserName(userInfo); |
||||||
|
if (user == null) { |
||||||
|
WebUtils.printAsString(res,"user:"+userInfo+" not found" ); |
||||||
|
return; |
||||||
|
} |
||||||
|
login(req, res, userInfo); |
||||||
|
String defaultUrl = getDefaultUrl(req); |
||||||
|
if(isMobile(req)){ |
||||||
|
LogKit.info("login to mobile {}",defaultUrl+"/url/mobile"); |
||||||
|
sendRedirect(res, defaultUrl+"/url/mobile"); |
||||||
|
return; |
||||||
|
} |
||||||
|
sendRedirect(res, defaultUrl); |
||||||
|
} |
||||||
|
|
||||||
|
public static String getDefaultUrl(HttpServletRequest req) { |
||||||
|
StringBuilder url = new StringBuilder(); |
||||||
|
try { |
||||||
|
url.append(req.getScheme()); |
||||||
|
url.append("://"); |
||||||
|
url.append(req.getServerName()); |
||||||
|
if (req.getServerPort() != 80) { |
||||||
|
url.append(":"); |
||||||
|
url.append(req.getServerPort()); |
||||||
|
} |
||||||
|
url.append(TemplateUtils.render("${fineServletURL}")); |
||||||
|
} catch (Exception e) { |
||||||
|
FineLoggerFactory.getLogger().error(e.getMessage(), e); |
||||||
|
} |
||||||
|
return url.toString(); |
||||||
|
} |
||||||
|
public static boolean isMobile(HttpServletRequest req) { |
||||||
|
String[] mobileArray = {"iPhone", "iPad", "android", "windows phone", "xiaomi"}; |
||||||
|
String userAgent = req.getHeader("user-agent"); |
||||||
|
if (userAgent != null && userAgent.toUpperCase().contains("MOBILE")) { |
||||||
|
for (String mobile : mobileArray) { |
||||||
|
if (userAgent.toUpperCase().contains(mobile.toUpperCase())) { |
||||||
|
return true; |
||||||
|
} |
||||||
|
} |
||||||
|
} |
||||||
|
return NetworkHelper.getDevice(req).isMobile(); |
||||||
|
} |
||||||
|
|
||||||
|
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); |
||||||
|
} catch (Exception e) { |
||||||
|
} |
||||||
|
} |
||||||
|
private String getUserInfo(String appToken,String userToken ) throws IOException { |
||||||
|
NEWLANConfig config = NEWLANConfig.getInstance(); |
||||||
|
String url=String.format("%s/v1/users/fetch?app_token=%s&user_token=%s",config.getApiUrl(),appToken,userToken); |
||||||
|
String resp = HttpKit.get(url); |
||||||
|
LogKit.info("url:{} getUserInfo resp:{}",url,resp); |
||||||
|
JSONObject entries = new JSONObject(resp); |
||||||
|
return entries.getJSONObject("data").getString("externalId"); |
||||||
|
} |
||||||
|
private String getAppToken( ) throws IOException { |
||||||
|
NEWLANConfig config = NEWLANConfig.getInstance(); |
||||||
|
String url=String.format("%s/v1/apptoken/create?grant_type=client_credential&appid=%s&secret=%s",config.getApiUrl(),config.getClientId(),config.getClientSecret()); |
||||||
|
String resp = HttpKit.get(url); |
||||||
|
LogKit.info("url:{} getAppToken resp:{} ",url,resp); |
||||||
|
JSONObject entries = new JSONObject(resp); |
||||||
|
return entries.getJSONObject("data").getString("app_token"); |
||||||
|
} |
||||||
|
private String getUserToken(String appToken,String code ,String re) throws IOException { |
||||||
|
NEWLANConfig config = NEWLANConfig.getInstance(); |
||||||
|
String url=String.format("%s/v1/usertoken/create?app_token=%s&grant_type=authorization_code&code=%s&redirect_uri=%s",config.getApiUrl(),appToken,code,re); |
||||||
|
String resp = HttpKit.get(url); |
||||||
|
LogKit.info("url:{} getUserToken resp:{}",url,resp); |
||||||
|
JSONObject entries = new JSONObject(resp); |
||||||
|
return entries.getJSONObject("data").getString("user_token"); |
||||||
|
} |
||||||
|
private void sendRedirect(HttpServletResponse res, String url) { |
||||||
|
res.setStatus(HttpServletResponse.SC_MOVED_TEMPORARILY); |
||||||
|
res.setHeader("Location", url); |
||||||
|
} |
||||||
|
} |
Loading…
Reference in new issue