14 changed files with 785 additions and 1 deletions
Binary file not shown.
Binary file not shown.
@ -1,3 +1,6 @@ |
|||||||
# open-JSD-8146 |
# open-JSD-8146 |
||||||
|
|
||||||
JSD-8146 开源任务材料 |
JSD-8146 开源任务材料\ |
||||||
|
免责说明:该源码为第三方爱好者提供,不保证源码和方案的可靠性,也不提供任何形式的源码教学指导和协助!\ |
||||||
|
仅作为开发者学习参考使用!禁止用于任何商业用途!\ |
||||||
|
为保护开发者隐私,开发者信息已隐去!若原开发者希望公开自己的信息,可联系hugh处理。 |
Binary file not shown.
@ -0,0 +1,24 @@ |
|||||||
|
<?xml version="1.0" encoding="UTF-8"?> |
||||||
|
<plugin> |
||||||
|
<id>com.fr.plugin.sso.auth</id> |
||||||
|
<name><![CDATA[单点登陆jsd8164]]></name> |
||||||
|
<active>yes</active> |
||||||
|
<version>1.0.8</version> |
||||||
|
<env-version>10.0</env-version> |
||||||
|
<jartime>2018-07-31</jartime> |
||||||
|
<vendor>fr.open</vendor> |
||||||
|
<description><![CDATA[单点登陆jsd8164]]></description> |
||||||
|
<change-notes><![CDATA[单点登陆jsd8164]]></change-notes> |
||||||
|
<main-package>com.fr.plugin.sso</main-package> |
||||||
|
<prefer-packages> |
||||||
|
<prefer-package>com.fanruan.api</prefer-package> |
||||||
|
</prefer-packages> |
||||||
|
<lifecycle-monitor class="com.fr.plugin.sso.LifeCycleMonitorImpl"/> |
||||||
|
<extra-core> |
||||||
|
<LocaleFinder class="com.fr.plugin.sso.LocaleFinder"/> |
||||||
|
</extra-core> |
||||||
|
<extra-decision> |
||||||
|
<GlobalRequestFilterProvider class="com.fr.plugin.sso.request.TokenLogin"/> |
||||||
|
</extra-decision> |
||||||
|
<function-recorder class="com.fr.plugin.sso.LocaleFinder"/> |
||||||
|
</plugin> |
@ -0,0 +1,34 @@ |
|||||||
|
/* |
||||||
|
* Copyright (C), 2018-2021 |
||||||
|
* Project: starter |
||||||
|
* FileName: LifeCycleMonitorImpl |
||||||
|
* Author: Louis |
||||||
|
* Date: 2021/3/30 15:10 |
||||||
|
*/ |
||||||
|
package com.fr.plugin.sso; |
||||||
|
|
||||||
|
import com.fr.plugin.context.PluginContext; |
||||||
|
import com.fr.plugin.observer.inner.AbstractPluginLifecycleMonitor; |
||||||
|
import com.fr.plugin.sso.config.SsoConfig; |
||||||
|
|
||||||
|
/** |
||||||
|
* <Function Description><br> |
||||||
|
* <LifeCycleMonitorImpl> |
||||||
|
* |
||||||
|
* @author fr.open |
||||||
|
* @since 1.0.0 |
||||||
|
*/ |
||||||
|
public class LifeCycleMonitorImpl extends AbstractPluginLifecycleMonitor { |
||||||
|
public LifeCycleMonitorImpl() { |
||||||
|
} |
||||||
|
|
||||||
|
@Override |
||||||
|
public void afterRun(PluginContext pluginContext) { |
||||||
|
SsoConfig.getInstance(); |
||||||
|
} |
||||||
|
|
||||||
|
@Override |
||||||
|
public void beforeStop(PluginContext pluginContext) { |
||||||
|
|
||||||
|
} |
||||||
|
} |
@ -0,0 +1,37 @@ |
|||||||
|
/* |
||||||
|
* Copyright (C), 2018-2020 |
||||||
|
* Project: starter |
||||||
|
* FileName: LocaleFinder |
||||||
|
* Author: Louis |
||||||
|
* Date: 2020/8/31 22:19 |
||||||
|
*/ |
||||||
|
package com.fr.plugin.sso; |
||||||
|
|
||||||
|
import com.fr.intelli.record.Focus; |
||||||
|
import com.fr.intelli.record.Original; |
||||||
|
import com.fr.record.analyzer.EnableMetrics; |
||||||
|
import com.fr.stable.fun.impl.AbstractLocaleFinder; |
||||||
|
|
||||||
|
import static com.fr.plugin.sso.config.SsoConfig.PLUGIN_ID; |
||||||
|
|
||||||
|
/** |
||||||
|
* <Function Description><br> |
||||||
|
* <LocaleFinder> |
||||||
|
* |
||||||
|
* @author fr.open |
||||||
|
* @since 1.0.0 |
||||||
|
*/ |
||||||
|
@EnableMetrics |
||||||
|
public class LocaleFinder extends AbstractLocaleFinder { |
||||||
|
|
||||||
|
@Override |
||||||
|
@Focus(id = PLUGIN_ID, text = "Plugin-Sso", source = Original.PLUGIN) |
||||||
|
public String find() { |
||||||
|
return "com/fr/plugin/sso/locale/lang"; |
||||||
|
} |
||||||
|
|
||||||
|
@Override |
||||||
|
public int currentAPILevel() { |
||||||
|
return CURRENT_LEVEL; |
||||||
|
} |
||||||
|
} |
@ -0,0 +1,88 @@ |
|||||||
|
/* |
||||||
|
* Copyright (C), 2018-2021 |
||||||
|
* Project: starter |
||||||
|
* FileName: OneAccessConfig |
||||||
|
* Author: Louis |
||||||
|
* Date: 2021/3/30 9:38 |
||||||
|
*/ |
||||||
|
package com.fr.plugin.sso.config; |
||||||
|
|
||||||
|
import com.fanruan.api.util.StringKit; |
||||||
|
import com.fr.config.*; |
||||||
|
import com.fr.config.holder.Conf; |
||||||
|
import com.fr.config.holder.factory.Holders; |
||||||
|
import com.fr.intelli.record.Focus; |
||||||
|
import com.fr.intelli.record.Original; |
||||||
|
|
||||||
|
/** |
||||||
|
* <Function Description><br> |
||||||
|
* <SsoConfig> |
||||||
|
* |
||||||
|
* @author fr.open |
||||||
|
* @since 1.0.0 |
||||||
|
*/ |
||||||
|
@Visualization(category = "Plugin-Sso_Group") |
||||||
|
public class SsoConfig extends DefaultConfiguration { |
||||||
|
public static final String PLUGIN_ID = "com.fr.plugin.sso.auth"; |
||||||
|
|
||||||
|
private static volatile SsoConfig config = null; |
||||||
|
|
||||||
|
@Focus(id = PLUGIN_ID, text = "Plugin-Sso", source = Original.PLUGIN) |
||||||
|
public static SsoConfig getInstance() { |
||||||
|
if (config == null) { |
||||||
|
config = ConfigContext.getConfigInstance(SsoConfig.class); |
||||||
|
} |
||||||
|
return config; |
||||||
|
} |
||||||
|
|
||||||
|
@Identifier(value = "appId", name = "Plugin-Sso_Config_AppId", description = "Plugin-Sso_Config_AppId_Description", status = Status.SHOW) |
||||||
|
private Conf<String> appId = Holders.simple(StringKit.EMPTY); |
||||||
|
@Identifier(value = "appKey", name = "Plugin-Sso_Config_AppKey", description = "Plugin-Sso_Config_AppKey_Description", status = Status.SHOW) |
||||||
|
private Conf<String> appKey = Holders.simple(StringKit.EMPTY); |
||||||
|
@Identifier(value = "tokenUrl", name = "Plugin-Sso_Config_TokenUrl", description = "Plugin-Sso_Config_TokenUrl_Description", status = Status.SHOW) |
||||||
|
private Conf<String> tokenUrl = Holders.simple(StringKit.EMPTY); |
||||||
|
@Identifier(value = "userInfoUrl", name = "Plugin-Sso_Config_UserInfoUrl", description = "Plugin-Sso_Config_UserInfoUrl_Description", status = Status.SHOW) |
||||||
|
private Conf<String> userInfoUrl = Holders.simple(StringKit.EMPTY); |
||||||
|
// @Identifier(value = "signOutUrl", name = "Plugin-Sso_Config_SignOutUrl", description = "Plugin-Sso_Config_SignOutUrl_Description", status = Status.SHOW)
|
||||||
|
// private Conf<String> signOutUrl = Holders.simple(StringKit.EMPTY);
|
||||||
|
|
||||||
|
public String getAppId() { |
||||||
|
return appId.get(); |
||||||
|
} |
||||||
|
|
||||||
|
public void setAppId(String appId) { |
||||||
|
this.appId.set(appId); |
||||||
|
} |
||||||
|
|
||||||
|
public String getAppKey() { |
||||||
|
return appKey.get(); |
||||||
|
} |
||||||
|
|
||||||
|
public void setAppKey(String appKey) { |
||||||
|
this.appKey.set(appKey); |
||||||
|
} |
||||||
|
|
||||||
|
public String getTokenUrl() { |
||||||
|
return tokenUrl.get(); |
||||||
|
} |
||||||
|
|
||||||
|
public void setTokenUrl(String tokenUrl) { |
||||||
|
this.tokenUrl.set(tokenUrl); |
||||||
|
} |
||||||
|
|
||||||
|
public String getUserInfoUrl() { |
||||||
|
return userInfoUrl.get(); |
||||||
|
} |
||||||
|
|
||||||
|
public void setUserInfoUrl(String userInfoUrl) { |
||||||
|
this.userInfoUrl.set(userInfoUrl); |
||||||
|
} |
||||||
|
|
||||||
|
// public String getSignOutUrl() {
|
||||||
|
// return signOutUrl.get();
|
||||||
|
// }
|
||||||
|
//
|
||||||
|
// public void setSignOutUrl(String signOutUrl) {
|
||||||
|
// this.signOutUrl.set(signOutUrl);
|
||||||
|
// }
|
||||||
|
} |
@ -0,0 +1,216 @@ |
|||||||
|
/* |
||||||
|
* Copyright (C), 2018-2021 |
||||||
|
* Project: starter |
||||||
|
* FileName: TokenLogin |
||||||
|
* Author: Louis |
||||||
|
* Date: 2021/3/30 22:09 |
||||||
|
*/ |
||||||
|
package com.fr.plugin.sso.request; |
||||||
|
|
||||||
|
import com.fanruan.api.decision.login.LoginKit; |
||||||
|
import com.fanruan.api.log.LogKit; |
||||||
|
import com.fanruan.api.net.NetworkKit; |
||||||
|
import com.fanruan.api.util.CodeKit; |
||||||
|
import com.fanruan.api.util.StringKit; |
||||||
|
import com.fr.base.TemplateUtils; |
||||||
|
import com.fr.decision.fun.impl.AbstractGlobalRequestFilterProvider; |
||||||
|
import com.fr.decision.webservice.utils.DecisionServiceConstants; |
||||||
|
import com.fr.decision.webservice.v10.login.LoginService; |
||||||
|
import com.fr.json.JSONObject; |
||||||
|
import com.fr.plugin.sso.config.SsoConfig; |
||||||
|
import com.fr.plugin.sso.service.SsoService; |
||||||
|
import com.fr.stable.CodeUtils; |
||||||
|
import com.fr.stable.StringUtils; |
||||||
|
import com.fr.web.utils.WebUtils; |
||||||
|
|
||||||
|
import javax.servlet.FilterChain; |
||||||
|
import javax.servlet.FilterConfig; |
||||||
|
import javax.servlet.http.HttpServletRequest; |
||||||
|
import javax.servlet.http.HttpServletResponse; |
||||||
|
import java.util.HashMap; |
||||||
|
import java.util.Map; |
||||||
|
|
||||||
|
/** |
||||||
|
* <Function Description><br> |
||||||
|
* <TokenLogin> |
||||||
|
* |
||||||
|
* @author fr.open |
||||||
|
* @since 1.0.0 |
||||||
|
*/ |
||||||
|
public class TokenLogin extends AbstractGlobalRequestFilterProvider { |
||||||
|
public static final String TPL_PATH = "/com/fr/plugin/sso/web/codePage.html"; |
||||||
|
public static final String REMOTE_DESIGN = "/remote/design"; |
||||||
|
public static final String RESOURCES_PATH = "/resources"; |
||||||
|
public static final String FILE_PATH = "/file"; |
||||||
|
public static final String SYSTEM_INFO = "/system/info"; |
||||||
|
public static final String SYSTEM_HEALTH = "/system/health"; |
||||||
|
public static final String MATERIALS_MIN_JS_MAP = "/materials.min.js.map"; |
||||||
|
public static final String LOGIN_PATH = "/login"; |
||||||
|
public static final String LOGIN_OTHER = "/login/"; |
||||||
|
public static final String LOGOUT_PATH = "/logout"; |
||||||
|
public static final String USER_LANGUAGE = "/v10/user/language"; |
||||||
|
|
||||||
|
public static final String SSO_CALLBACK = "/sso_callback"; |
||||||
|
public static final String CALLBACK = "callback"; |
||||||
|
public static final String SOURCE_URL = "sourceUrl"; |
||||||
|
|
||||||
|
private SsoService ssoService; |
||||||
|
|
||||||
|
/** |
||||||
|
* 过滤器名称 |
||||||
|
* |
||||||
|
* @return |
||||||
|
*/ |
||||||
|
@Override |
||||||
|
public String filterName() { |
||||||
|
return "SsoFilter"; |
||||||
|
} |
||||||
|
|
||||||
|
/** |
||||||
|
* 过滤规则 |
||||||
|
* |
||||||
|
* @return |
||||||
|
*/ |
||||||
|
@Override |
||||||
|
public String[] urlPatterns() { |
||||||
|
return new String[]{"/*"}; |
||||||
|
} |
||||||
|
|
||||||
|
/** |
||||||
|
* 过滤器初始化 |
||||||
|
* |
||||||
|
* @param filterConfig |
||||||
|
*/ |
||||||
|
@Override |
||||||
|
public void init(FilterConfig filterConfig) { |
||||||
|
ssoService = new SsoService(); |
||||||
|
super.init(filterConfig); |
||||||
|
} |
||||||
|
|
||||||
|
/** |
||||||
|
* 过滤器处理 |
||||||
|
* |
||||||
|
* @param request |
||||||
|
* @param response |
||||||
|
* @param filterChain |
||||||
|
*/ |
||||||
|
@Override |
||||||
|
public void doFilter(HttpServletRequest request, HttpServletResponse response, FilterChain filterChain) { |
||||||
|
try { |
||||||
|
if (operation(request, response)) { |
||||||
|
filterChain.doFilter(request, response); |
||||||
|
} |
||||||
|
} catch (Exception e) { |
||||||
|
LogKit.error(e.getMessage(), e); |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
/** |
||||||
|
* 用户验证登陆操作 |
||||||
|
* |
||||||
|
* @param req |
||||||
|
* @param res |
||||||
|
* @throws Exception |
||||||
|
*/ |
||||||
|
private boolean operation(HttpServletRequest req, HttpServletResponse res) throws Exception { |
||||||
|
String pathInfo = (req.getPathInfo() != null) ? req.getPathInfo() : StringKit.EMPTY; |
||||||
|
LogKit.info("sso-TokenLogin-operation-pathInfo:{}", pathInfo); |
||||||
|
if (pathInfo.startsWith(REMOTE_DESIGN) || pathInfo.startsWith(LOGIN_OTHER) |
||||||
|
|| StringKit.equals(LOGIN_PATH, pathInfo) || pathInfo.startsWith(SYSTEM_HEALTH) |
||||||
|
|| pathInfo.startsWith(RESOURCES_PATH) || pathInfo.startsWith(LOGOUT_PATH) |
||||||
|
|| pathInfo.startsWith(SYSTEM_INFO) || pathInfo.startsWith(MATERIALS_MIN_JS_MAP) |
||||||
|
|| pathInfo.startsWith(USER_LANGUAGE) || pathInfo.startsWith(FILE_PATH)) { |
||||||
|
return true; |
||||||
|
} |
||||||
|
// 已登录
|
||||||
|
if (LoginService.getInstance().isLogged(req)) { |
||||||
|
return true; |
||||||
|
} |
||||||
|
String callback = NetworkKit.getHTTPRequestParameter(req, CALLBACK); |
||||||
|
if (StringKit.isBlank(callback)) { |
||||||
|
loginPage(req, res); |
||||||
|
return false; |
||||||
|
} |
||||||
|
if (!pathInfo.startsWith(SSO_CALLBACK)) { |
||||||
|
return true; |
||||||
|
} |
||||||
|
String ip = ssoService.getIpAddr(req); |
||||||
|
JSONObject ssoToken = ssoService.getSsoToken(callback, ip); |
||||||
|
LogKit.error("sso-TokenLogin-operation-ssoToken:{}", ssoToken); |
||||||
|
if (ssoToken == null || !StringKit.equals(ssoToken.getString("Success"), "true")) { |
||||||
|
return true; |
||||||
|
} |
||||||
|
//获取单点登陆用户的相关信息
|
||||||
|
JSONObject ssoUserInfo = ssoService.getSsoUserInfo(ssoToken.getString("Message"), ip); |
||||||
|
if (ssoUserInfo == null || !StringKit.equals(ssoUserInfo.getString("Success"), "true")) { |
||||||
|
return true; |
||||||
|
} |
||||||
|
//往session设置ssoTokenMessage参数值
|
||||||
|
req.getSession().setAttribute("ssoTokenMessage", ssoToken.get("Message").toString()); |
||||||
|
//往session设置ssoUserInfo参数值
|
||||||
|
req.getSession().setAttribute("ssoUserInfo", ssoUserInfo); |
||||||
|
String username = ssoUserInfo.get("AppAccount").toString(); |
||||||
|
if (StringKit.isBlank(username)) { |
||||||
|
return true; |
||||||
|
} |
||||||
|
LogKit.error("sso-TokenLogin-operation-username:{}", username); |
||||||
|
String tokenFR = LoginKit.login(req, res, username); |
||||||
|
req.setAttribute(DecisionServiceConstants.FINE_AUTH_TOKEN_NAME, tokenFR); |
||||||
|
String sourceUrl = encodeViewlet(NetworkKit.getHTTPRequestParameter(req, SOURCE_URL)); |
||||||
|
LogKit.error("sso-TokenLogin-operation-sourceUrl:{}", sourceUrl); |
||||||
|
res.sendRedirect(sourceUrl); |
||||||
|
return false; |
||||||
|
} |
||||||
|
|
||||||
|
/** |
||||||
|
* 登陆页面 |
||||||
|
* |
||||||
|
* @param req |
||||||
|
* @param res |
||||||
|
* @return |
||||||
|
* @throws Exception |
||||||
|
*/ |
||||||
|
private void loginPage(HttpServletRequest req, HttpServletResponse res) throws Exception { |
||||||
|
Map<String, String> parameterMap = new HashMap<>(); |
||||||
|
parameterMap.put("appId", SsoConfig.getInstance().getAppId()); |
||||||
|
parameterMap.put("sourceUrl", CodeKit.encodeURIComponent(getOriginalURL(req))); |
||||||
|
String codePage = TemplateUtils.renderTemplate(TPL_PATH, parameterMap); |
||||||
|
LogKit.info("sso-TokenLogin-loginPage-codePage:{}", codePage); |
||||||
|
WebUtils.printAsString(res, codePage); |
||||||
|
} |
||||||
|
|
||||||
|
/** |
||||||
|
* 得到请求url和参数 |
||||||
|
* |
||||||
|
* @param request |
||||||
|
* @return |
||||||
|
*/ |
||||||
|
private String getOriginalURL(HttpServletRequest request) { |
||||||
|
StringBuffer url = request.getRequestURL(); |
||||||
|
if (StringKit.isNotBlank(request.getQueryString())) { |
||||||
|
url.append("?").append(request.getQueryString()); |
||||||
|
} |
||||||
|
return url.toString(); |
||||||
|
} |
||||||
|
|
||||||
|
/** |
||||||
|
* viewlet中文处理编码 |
||||||
|
* |
||||||
|
* @param url |
||||||
|
* @return |
||||||
|
*/ |
||||||
|
private String encodeViewlet(String url) { |
||||||
|
if (StringKit.isBlank(url)) { |
||||||
|
return url; |
||||||
|
} |
||||||
|
String paramViewlet = StringUtils.EMPTY; |
||||||
|
if (url.contains("viewlet=")) { |
||||||
|
paramViewlet = url.split("viewlet=")[1]; |
||||||
|
paramViewlet = paramViewlet.split("&")[0]; |
||||||
|
} |
||||||
|
if (StringUtils.isNotEmpty(paramViewlet)) { |
||||||
|
url = url.replaceFirst(paramViewlet, CodeUtils.encodeURIComponent(paramViewlet)); |
||||||
|
} |
||||||
|
return url; |
||||||
|
} |
||||||
|
} |
@ -0,0 +1,171 @@ |
|||||||
|
package com.fr.plugin.sso.service; |
||||||
|
|
||||||
|
import com.fanruan.api.log.LogKit; |
||||||
|
import com.fr.json.JSONObject; |
||||||
|
import com.fr.plugin.sso.config.SsoConfig; |
||||||
|
import com.fr.plugin.sso.utils.HttpRequest; |
||||||
|
|
||||||
|
import javax.servlet.http.HttpServletRequest; |
||||||
|
import java.util.Map; |
||||||
|
|
||||||
|
/** |
||||||
|
* 单点登录服务类 |
||||||
|
* |
||||||
|
* @author |
||||||
|
*/ |
||||||
|
public class SsoService { |
||||||
|
|
||||||
|
/** |
||||||
|
* 单点登陆系统appid |
||||||
|
**/ |
||||||
|
private String appid; |
||||||
|
/** |
||||||
|
* 单点登陆系统appkey |
||||||
|
**/ |
||||||
|
private String appkey; |
||||||
|
/** |
||||||
|
* 单点登陆系统tokenurl |
||||||
|
**/ |
||||||
|
private String tokenurl; |
||||||
|
/** |
||||||
|
* 单点登陆系统userinfourl |
||||||
|
**/ |
||||||
|
private String userinfourl; |
||||||
|
/** |
||||||
|
* 单点登陆系统signouturl |
||||||
|
**/ |
||||||
|
private String signouturl; |
||||||
|
|
||||||
|
public SsoService() { |
||||||
|
//初始化加载配置文件中的相关信息
|
||||||
|
SsoConfig config = SsoConfig.getInstance(); |
||||||
|
appid = config.getAppId(); |
||||||
|
appkey = config.getAppKey(); |
||||||
|
tokenurl = config.getTokenUrl(); |
||||||
|
userinfourl = config.getUserInfoUrl(); |
||||||
|
// signouturl = config.getSignOutUrl();
|
||||||
|
} |
||||||
|
|
||||||
|
/** |
||||||
|
* 获取单点登陆用户的相关信息 |
||||||
|
* 由于返回SsoUserInfo首字母大写,javabean处理不方便,直接使用map获取。 |
||||||
|
* 其中map中包括的数值有: |
||||||
|
* boolean Success; |
||||||
|
* String Message; |
||||||
|
* String OpenID; |
||||||
|
* String AppAccount; |
||||||
|
* String EmpID; |
||||||
|
* String Job; |
||||||
|
* String Token; |
||||||
|
* String UserName; |
||||||
|
* String DepartmentID; |
||||||
|
* String DepartmentName; |
||||||
|
* String CompanyID; |
||||||
|
* String CompanyName; |
||||||
|
* String Title; |
||||||
|
* String Office; |
||||||
|
* boolean InService; |
||||||
|
* 为支持jdk1.4版本,不使用泛型 |
||||||
|
* |
||||||
|
* @param token 单点登陆系统token |
||||||
|
* @param ip 用户IP |
||||||
|
* @return |
||||||
|
*/ |
||||||
|
public JSONObject getSsoUserInfo(String token, String ip) { |
||||||
|
String urlString = userinfourl + "?token=" + token + "&appid=" + appid |
||||||
|
+ "&appkey=" + appkey + "&ip=" + ip; |
||||||
|
LogKit.error("sso-SsoService-getSsoUserInfo-urlString:{}", urlString); |
||||||
|
try { |
||||||
|
//获取返还信息
|
||||||
|
String json = HttpRequest.sendGet(urlString); |
||||||
|
LogKit.error("sso-SsoService-getSsoUserInfo-json:{}", json); |
||||||
|
// 对返回的JSON进行转换
|
||||||
|
if (json != null && !"".equals(json.trim())) { |
||||||
|
return new JSONObject(json); |
||||||
|
} |
||||||
|
} catch (Exception e) { |
||||||
|
LogKit.error(e.getMessage(), e); |
||||||
|
} |
||||||
|
return null; |
||||||
|
} |
||||||
|
|
||||||
|
|
||||||
|
/** |
||||||
|
* 获取ssoToken ,callback是单点登录系统中返回的参数 |
||||||
|
* 由于返回token首字母大写,使用map获取。map包含的参数有: |
||||||
|
* String Success; |
||||||
|
* String Message; |
||||||
|
* 为支持jdk1.4版本,不使用泛型 |
||||||
|
* |
||||||
|
* @param callback |
||||||
|
* @return |
||||||
|
*/ |
||||||
|
public JSONObject getSsoToken(String callback, String ip) { |
||||||
|
String urlString = tokenurl + "?callback=" + callback + "&appid=" |
||||||
|
+ appid + "&appkey=" + appkey + "&ip=" + ip; |
||||||
|
LogKit.error("sso-SsoService-getSsoToken-urlString:{}", urlString); |
||||||
|
try { |
||||||
|
//获取返还信息
|
||||||
|
String json = HttpRequest.sendGet(urlString); |
||||||
|
LogKit.error("sso-SsoService-getSsoToken-json:{}", json); |
||||||
|
// 对返回的JSON进行转换
|
||||||
|
if (json != null && !"".equals(json.trim())) { |
||||||
|
return new JSONObject(json); |
||||||
|
} |
||||||
|
} catch (Exception e) { |
||||||
|
LogKit.error(e.getMessage(), e); |
||||||
|
} // 使用finally块来关闭输出流、输入流
|
||||||
|
return null; |
||||||
|
} |
||||||
|
|
||||||
|
/** |
||||||
|
* 注销单点登陆 |
||||||
|
* |
||||||
|
* @param token 单点登陆系统token |
||||||
|
* @param ip 用户IP |
||||||
|
* @return |
||||||
|
*/ |
||||||
|
public boolean signOut(String token, String ip) { |
||||||
|
Map userInfo = null; |
||||||
|
boolean returnFlag = false; |
||||||
|
String urlString = signouturl + "?token=" + token + "&appid=" + appid |
||||||
|
+ "&appkey=" + appkey + "&ip=" + ip; |
||||||
|
try { |
||||||
|
//获取返还信息
|
||||||
|
String json = HttpRequest.sendGet(urlString); |
||||||
|
//判断json是否是true
|
||||||
|
if (json != null && "true".equals(json.trim())) { |
||||||
|
returnFlag = Boolean.valueOf(json).booleanValue(); |
||||||
|
} |
||||||
|
} catch (Exception e) { |
||||||
|
LogKit.error(e.getMessage(), e); |
||||||
|
} |
||||||
|
return returnFlag; |
||||||
|
} |
||||||
|
|
||||||
|
/** |
||||||
|
* 获取登录用户的IP地址 |
||||||
|
* |
||||||
|
* @param request |
||||||
|
* @return |
||||||
|
*/ |
||||||
|
public static String getIpAddr(HttpServletRequest request) { |
||||||
|
String ip = request.getHeader("x-forwarded-for"); |
||||||
|
if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) { |
||||||
|
ip = request.getHeader("Proxy-Client-IP"); |
||||||
|
} |
||||||
|
if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) { |
||||||
|
ip = request.getHeader("WL-Proxy-Client-IP"); |
||||||
|
} |
||||||
|
if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) { |
||||||
|
ip = request.getRemoteAddr(); |
||||||
|
} |
||||||
|
if (ip.equals("0:0:0:0:0:0:0:1")) { |
||||||
|
ip = "本地"; |
||||||
|
} |
||||||
|
if (ip.split(",").length > 1) { |
||||||
|
ip = ip.split(",")[0]; |
||||||
|
} |
||||||
|
return ip; |
||||||
|
} |
||||||
|
} |
@ -0,0 +1,164 @@ |
|||||||
|
package com.fr.plugin.sso.utils; |
||||||
|
|
||||||
|
import java.io.BufferedReader; |
||||||
|
import java.io.IOException; |
||||||
|
import java.io.InputStreamReader; |
||||||
|
import java.io.PrintWriter; |
||||||
|
import java.net.URL; |
||||||
|
import java.net.URLConnection; |
||||||
|
import java.util.HashMap; |
||||||
|
import java.util.Iterator; |
||||||
|
import java.util.Map; |
||||||
|
|
||||||
|
|
||||||
|
/** |
||||||
|
* http请求工具类,为支持jdk1.4,不使用泛型 |
||||||
|
* |
||||||
|
* @author |
||||||
|
*/ |
||||||
|
public class HttpRequest { |
||||||
|
|
||||||
|
/** |
||||||
|
* 向指定 URL 发送POST方法的请求 |
||||||
|
* |
||||||
|
* @param fullurl 完整的URL,可能包括一些参数如 ?a=B&c=D |
||||||
|
* @return 所代表远程资源的响应结果 |
||||||
|
*/ |
||||||
|
public static String sendGet(String fullurl) { |
||||||
|
StringBuffer result = new StringBuffer(); |
||||||
|
BufferedReader in = null; |
||||||
|
try { |
||||||
|
String urlNameString = fullurl; |
||||||
|
URL realUrl = new URL(urlNameString); |
||||||
|
// 打开和URL之间的连接
|
||||||
|
URLConnection connection = realUrl.openConnection(); |
||||||
|
// 设置通用的请求属性
|
||||||
|
//connection.setRequestProperty("accept", "*/*");
|
||||||
|
//connection.setRequestProperty("connection", "Keep-Alive");
|
||||||
|
//connection.setRequestProperty("user-agent",
|
||||||
|
// "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1;SV1)");
|
||||||
|
|
||||||
|
// connection.setRequestProperty("Authorization", "Basic "+base64(user, password));
|
||||||
|
|
||||||
|
// 建立实际的连接
|
||||||
|
connection.connect(); |
||||||
|
// 获取所有响应头字段
|
||||||
|
Map map = connection.getHeaderFields(); |
||||||
|
// 遍历所有的响应头字段
|
||||||
|
//for (String key : map.keySet()) {
|
||||||
|
// System.out.println(key + "--->" + map.get(key));
|
||||||
|
//}
|
||||||
|
// 定义 BufferedReader输入流来读取URL的响应
|
||||||
|
|
||||||
|
in = new BufferedReader(new InputStreamReader(connection.getInputStream(), "utf-8")); |
||||||
|
String line; |
||||||
|
while ((line = in.readLine()) != null) { |
||||||
|
result.append(line); |
||||||
|
} |
||||||
|
} catch (Exception e) { |
||||||
|
System.err.println("发送GET请求出现异常!" + e); |
||||||
|
e.printStackTrace(); |
||||||
|
} |
||||||
|
// 使用finally块来关闭输入流
|
||||||
|
finally { |
||||||
|
try { |
||||||
|
if (in != null) { |
||||||
|
in.close(); |
||||||
|
} |
||||||
|
} catch (Exception e2) { |
||||||
|
e2.printStackTrace(); |
||||||
|
} |
||||||
|
} |
||||||
|
return result.toString(); |
||||||
|
} |
||||||
|
|
||||||
|
/** |
||||||
|
* 向指定 URL 发送POST方法的请求 |
||||||
|
* |
||||||
|
* @param url 发送请求的 URL |
||||||
|
* @param params 请求参数 |
||||||
|
* @return 所代表远程资源的响应结果 |
||||||
|
*/ |
||||||
|
public static String sendPost(String url, HashMap params) { |
||||||
|
PrintWriter out = null; |
||||||
|
BufferedReader in = null; |
||||||
|
StringBuffer result = new StringBuffer(); |
||||||
|
|
||||||
|
try { |
||||||
|
URL realUrl = new URL(url); |
||||||
|
// 打开和URL之间的连接
|
||||||
|
URLConnection connection = realUrl.openConnection(); |
||||||
|
// 设置通用的请求属性
|
||||||
|
// connection.setRequestProperty("accept", "*/*");
|
||||||
|
// connection.setRequestProperty("connection", "Keep-Alive");
|
||||||
|
// connection.setRequestProperty("user-agent",
|
||||||
|
// "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1;SV1)");
|
||||||
|
|
||||||
|
// connection.setRequestProperty("Authorization", "Basic "+base64(user, password));
|
||||||
|
connection.setRequestProperty("Accept-Charset", "utf-8"); |
||||||
|
connection.setRequestProperty("contentType", "utf-8"); |
||||||
|
|
||||||
|
// 发送POST请求必须设置如下两行
|
||||||
|
connection.setDoOutput(true); |
||||||
|
connection.setDoInput(true); |
||||||
|
// 获取URLConnection对象对应的输出流
|
||||||
|
|
||||||
|
out = new PrintWriter(connection.getOutputStream()); |
||||||
|
// 发送请求参数
|
||||||
|
StringBuffer param = new StringBuffer(); |
||||||
|
for (Iterator iterator = params.keySet().iterator(); iterator.hasNext(); ) { |
||||||
|
String key = (String) iterator.next(); |
||||||
|
|
||||||
|
Object obj = params.get(key); |
||||||
|
|
||||||
|
if (obj == null) continue; |
||||||
|
|
||||||
|
if (obj.getClass().isArray()) { |
||||||
|
//数组的处理方式
|
||||||
|
Object[] objs = (Object[]) obj; |
||||||
|
|
||||||
|
for (int i = 0; i < objs.length; i++) { |
||||||
|
param.append(key).append("=").append(objs[i]); |
||||||
|
|
||||||
|
param.append("&"); |
||||||
|
} |
||||||
|
} else { |
||||||
|
param.append(key).append("=").append(obj); |
||||||
|
param.append("&"); |
||||||
|
} |
||||||
|
|
||||||
|
} |
||||||
|
out.print(param.toString()); |
||||||
|
// flush输出流的缓冲
|
||||||
|
out.flush(); |
||||||
|
// 定义BufferedReader输入流来读取URL的响应
|
||||||
|
in = new BufferedReader(new InputStreamReader(connection.getInputStream(), "UTF-8")); |
||||||
|
|
||||||
|
String line; |
||||||
|
while ((line = in.readLine()) != null) { |
||||||
|
//result += line;
|
||||||
|
result.append(line); |
||||||
|
} |
||||||
|
} catch (Exception e) { |
||||||
|
System.err.println("发送 POST 请求出现异常!" + e); |
||||||
|
e.printStackTrace(); |
||||||
|
|
||||||
|
return "{\"success\": false, \"message\": \"" + e.getMessage() + "\" }"; |
||||||
|
} |
||||||
|
// 使用finally块来关闭输出流、输入流
|
||||||
|
finally { |
||||||
|
try { |
||||||
|
if (out != null) { |
||||||
|
out.close(); |
||||||
|
} |
||||||
|
if (in != null) { |
||||||
|
in.close(); |
||||||
|
} |
||||||
|
} catch (IOException ex) { |
||||||
|
ex.printStackTrace(); |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
return result.toString(); |
||||||
|
} |
||||||
|
} |
@ -0,0 +1,12 @@ |
|||||||
|
Plugin-Sso=Sso Plugin |
||||||
|
Plugin-Sso_Group=Sso Plugin |
||||||
|
Plugin-Sso_Config_AppId=AppId |
||||||
|
Plugin-Sso_Config_AppId_Description=AppId |
||||||
|
Plugin-Sso_Config_AppKey=AppKey |
||||||
|
Plugin-Sso_Config_AppKey_Description=AppKey |
||||||
|
Plugin-Sso_Config_TokenUrl=TokenUrl |
||||||
|
Plugin-Sso_Config_TokenUrl_Description=TokenUrl |
||||||
|
Plugin-Sso_Config_UserInfoUrl=UserInfoUrl |
||||||
|
Plugin-Sso_Config_UserInfoUrl_Description=UserInfoUrl |
||||||
|
Plugin-Sso_Config_SignOutUrl=SignOutUrl |
||||||
|
Plugin-Sso_Config_SignOutUrl_Description=SignOutUrl |
@ -0,0 +1,12 @@ |
|||||||
|
Plugin-Sso=\u5355\u70B9\u767B\u9646\u63D2\u4EF6 |
||||||
|
Plugin-Sso_Group=\u5355\u70B9\u767B\u9646\u63D2\u4EF6 |
||||||
|
Plugin-Sso_Config_AppId=\u5E06\u8F6F\u7CFB\u7EDF\u4EE3\u7801APPID |
||||||
|
Plugin-Sso_Config_AppId_Description=\u5E06\u8F6F\u7CFB\u7EDF\u4EE3\u7801APPID |
||||||
|
Plugin-Sso_Config_AppKey=\u5E06\u8F6F\u7CFB\u7EDFAPPKEY |
||||||
|
Plugin-Sso_Config_AppKey_Description=\u5E06\u8F6F\u7CFB\u7EDFAPPKEY |
||||||
|
Plugin-Sso_Config_TokenUrl=Token\u63A5\u53E3\u5730\u5740 |
||||||
|
Plugin-Sso_Config_TokenUrl_Description=Token\u63A5\u53E3\u5730\u5740 |
||||||
|
Plugin-Sso_Config_UserInfoUrl=UserInfo\u63A5\u53E3\u5730\u5740 |
||||||
|
Plugin-Sso_Config_UserInfoUrl_Description=UserInfo\u63A5\u53E3\u5730\u5740 |
||||||
|
Plugin-Sso_Config_SignOutUrl=\u767B\u51FA\u5730\u5740 |
||||||
|
Plugin-Sso_Config_SignOutUrl_Description=\u767B\u51FA\u5730\u5740 |
@ -0,0 +1,23 @@ |
|||||||
|
<!DOCTYPE html> |
||||||
|
<html lang="zh"> |
||||||
|
<head> |
||||||
|
<meta charset="utf-8"> |
||||||
|
<meta http-equiv="X-UA-Compatible" content="IE=edge"> |
||||||
|
<meta name="viewport" content="width=device-width,initial-scale=1.0"> |
||||||
|
<title>登陆中</title> |
||||||
|
<script src="http://wfserver.gree.com/sso/Scripts/jquery-1.6.4.min.js"></script> |
||||||
|
<script src="http://wfserver.gree.com/sso/Scripts/greesso2.js"></script> |
||||||
|
<link href="http://wfserver.gree.com/sso/Content/greesso.css" rel="stylesheet"/> |
||||||
|
<script type="text/javascript"> |
||||||
|
$(document).ready(function () { |
||||||
|
setTimeout(function () { |
||||||
|
$("#message").html('<span style="color:red;">单点登陆超时,请刷新重试。<span/>') |
||||||
|
}, 2000) |
||||||
|
}); |
||||||
|
</script> |
||||||
|
</head> |
||||||
|
<body> |
||||||
|
<span id="message">登陆</span> |
||||||
|
<span id="ssoLogin" appid="${appId}" sourceUrl="${sourceUrl}" autoOpenLoginForm="true"></span> |
||||||
|
</body> |
||||||
|
</html> |
Loading…
Reference in new issue