LAPTOP-SB56SG4Q\86185
3 years ago
11 changed files with 948 additions and 1 deletions
Binary file not shown.
@ -1,3 +1,6 @@
|
||||
# open-JSD-7957 |
||||
|
||||
jsd-7957 开源材料 |
||||
jsd-7957 开源材料\ |
||||
免责说明:该源码为第三方爱好者提供,不保证源码和方案的可靠性,也不提供任何形式的源码教学指导和协助!\ |
||||
仅作为开发者学习参考使用!禁止用于任何商业用途!\ |
||||
为保护开发者隐私,开发者信息已隐去!若原开发者希望公开自己的信息,可联系hugh处理。 |
@ -0,0 +1,12 @@
|
||||
#单点登录统一地址 |
||||
auth_url= |
||||
#获取tokan地址 |
||||
token_url= |
||||
#获取用户信息结论 |
||||
user_url= |
||||
#client_id |
||||
client_id= |
||||
#client_secret |
||||
client_secret= |
||||
#登出后跳转地址 |
||||
logout= |
@ -0,0 +1,21 @@
|
||||
<?xml version="1.0" encoding="UTF-8" standalone="no"?><plugin> |
||||
<id>com.fr.plugin.sxka.sso</id> |
||||
<name><![CDATA[sso]]></name> |
||||
<active>yes</active> |
||||
<version>1.9</version> |
||||
<env-version>10.0</env-version> |
||||
<jartime>2018-07-31</jartime> |
||||
<vendor>fr.open</vendor> |
||||
<description><![CDATA[sso]]></description> |
||||
<change-notes><![CDATA[ |
||||
<!--[2016-11-01]改进API接口,更加好的支持多多种类型的导出。<br/>--> |
||||
]]></change-notes> |
||||
<extra-decision> |
||||
<GlobalRequestFilterProvider class="com.fr.plugin.sxka.sso.SsoFilter"/> |
||||
<LogInOutEventProvider class="com.fr.plugin.sxka.sso.CustomLogInOutEventProvider"/> |
||||
</extra-decision> |
||||
<extra-core> |
||||
<DBAccessProvider class="com.fr.plugin.sxka.sso.RoleDBAccessProvider"/> |
||||
</extra-core> |
||||
<function-recorder class="com.fr.plugin.sxka.sso.SsoFilter"/> |
||||
</plugin> |
@ -0,0 +1,40 @@
|
||||
package com.fr.plugin.sxka.sso; |
||||
|
||||
import com.fr.decision.fun.impl.AbstractLogInOutEventProvider; |
||||
import com.fr.decision.webservice.login.LogInOutResultInfo; |
||||
import com.fr.decision.webservice.utils.DecisionStatusService; |
||||
import com.fr.general.PropertiesUtils; |
||||
import com.fr.log.FineLoggerFactory; |
||||
|
||||
import javax.servlet.http.Cookie; |
||||
import javax.servlet.http.HttpServletRequest; |
||||
|
||||
/** |
||||
* @Author fr.open |
||||
* @Date 2020/9/18 |
||||
* @Description |
||||
**/ |
||||
public class CustomLogInOutEventProvider extends AbstractLogInOutEventProvider { |
||||
@Override |
||||
public String logoutAction(LogInOutResultInfo result) { |
||||
String state = getUserStateFromCookie(result.getRequest()); |
||||
try { |
||||
DecisionStatusService.loginStatusService().delete(state); |
||||
} catch (Exception e) { |
||||
FineLoggerFactory.getLogger().error(e.getMessage(),e); |
||||
} |
||||
String logout = PropertiesUtils.getProperties("conf").getProperty("logout"); |
||||
String format = "%s?client_id=%s&callback=%s&state=%s"; |
||||
return String.format(format, logout, PropertiesUtils.getProperties("conf").getProperty("client_id"), PropertiesUtils.getProperties("conf").getProperty("redirect_uri"),state); |
||||
} |
||||
|
||||
private String getUserStateFromCookie(HttpServletRequest request) { |
||||
if (request.getCookies() == null) return null; |
||||
|
||||
for (Cookie cookie : request.getCookies()) { |
||||
if ("uid_state".equals(cookie.getName())) return cookie.getValue(); |
||||
} |
||||
return null; |
||||
} |
||||
|
||||
} |
@ -0,0 +1,44 @@
|
||||
package com.fr.plugin.sxka.sso; |
||||
|
||||
import com.fr.db.fun.impl.AbstractDBAccessProvider; |
||||
import com.fr.plugin.sxka.sso.dao.UserInfoDao; |
||||
import com.fr.plugin.sxka.sso.entity.UserInfoEntity; |
||||
import com.fr.stable.db.accessor.DBAccessor; |
||||
import com.fr.stable.db.dao.BaseDAO; |
||||
import com.fr.stable.db.dao.DAOProvider; |
||||
|
||||
/** |
||||
* @Author fr.open |
||||
* @Date 2021/5/13 |
||||
* @Description |
||||
**/ |
||||
public class RoleDBAccessProvider extends AbstractDBAccessProvider { |
||||
|
||||
private static DBAccessor dbAccessor = null; |
||||
|
||||
public static DBAccessor getDbAccessor() { |
||||
return dbAccessor; |
||||
} |
||||
|
||||
@Override |
||||
public DAOProvider[] registerDAO() { |
||||
return new DAOProvider[]{ |
||||
new DAOProvider() { |
||||
@Override |
||||
public Class getEntityClass() { |
||||
return UserInfoEntity.class; |
||||
} |
||||
|
||||
@Override |
||||
public Class<? extends BaseDAO> getDAOClass() { |
||||
return UserInfoDao.class; |
||||
} |
||||
} |
||||
}; |
||||
} |
||||
|
||||
@Override |
||||
public void onDBAvailable(DBAccessor dbAccessor) { |
||||
RoleDBAccessProvider.dbAccessor = dbAccessor; |
||||
} |
||||
} |
@ -0,0 +1,493 @@
|
||||
package com.fr.plugin.sxka.sso; |
||||
|
||||
import com.fr.base.PropertiesUtils; |
||||
import com.fr.data.NetworkHelper; |
||||
import com.fr.decision.authority.AuthorityContext; |
||||
import com.fr.decision.authority.data.CustomRole; |
||||
import com.fr.decision.authority.data.User; |
||||
import com.fr.decision.fun.impl.AbstractGlobalRequestFilterProvider; |
||||
import com.fr.decision.mobile.terminal.TerminalHandler; |
||||
import com.fr.decision.webservice.bean.authentication.OriginUrlResponseBean; |
||||
import com.fr.decision.webservice.bean.user.UserBean; |
||||
import com.fr.decision.webservice.exception.user.UserNotExistException; |
||||
import com.fr.decision.webservice.utils.DecisionServiceConstants; |
||||
import com.fr.decision.webservice.utils.DecisionStatusService; |
||||
import com.fr.decision.webservice.utils.WebServiceUtils; |
||||
import com.fr.decision.webservice.v10.login.LoginService; |
||||
import com.fr.decision.webservice.v10.login.TokenResource; |
||||
import com.fr.decision.webservice.v10.user.UserService; |
||||
import com.fr.general.http.HttpRequest; |
||||
import com.fr.general.http.HttpToolbox; |
||||
import com.fr.json.JSONObject; |
||||
import com.fr.json.revise.EmbedJson; |
||||
import com.fr.locale.InterProviderFactory; |
||||
import com.fr.log.FineLoggerFactory; |
||||
import com.fr.plugin.sxka.sso.dao.UserInfoDao; |
||||
import com.fr.plugin.sxka.sso.entity.UserInfoEntity; |
||||
import com.fr.plugin.transform.FunctionRecorder; |
||||
import com.fr.security.encryption.transmission.TransmissionEncryptors; |
||||
import com.fr.stable.StringUtils; |
||||
import com.fr.stable.db.action.DBAction; |
||||
import com.fr.stable.db.dao.DAOContext; |
||||
import com.fr.stable.query.QueryFactory; |
||||
import com.fr.stable.query.restriction.RestrictionFactory; |
||||
import com.fr.stable.web.Device; |
||||
import com.fr.third.fasterxml.jackson.databind.DeserializationFeature; |
||||
import com.fr.third.fasterxml.jackson.databind.ObjectMapper; |
||||
import com.fr.third.springframework.http.HttpHeaders; |
||||
import com.fr.third.springframework.http.MediaType; |
||||
import com.fr.third.springframework.util.DigestUtils; |
||||
import com.fr.web.controller.decision.api.auth.LoginResource; |
||||
import com.fr.web.utils.WebUtils; |
||||
|
||||
import javax.servlet.FilterChain; |
||||
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.PrintWriter; |
||||
import java.net.URLEncoder; |
||||
import java.nio.charset.StandardCharsets; |
||||
import java.util.*; |
||||
|
||||
/** |
||||
* @Author fr.open |
||||
* @Date 2021/5/12 |
||||
* @Description |
||||
**/ |
||||
@FunctionRecorder |
||||
public class SsoFilter extends AbstractGlobalRequestFilterProvider { |
||||
|
||||
private static String[] notFilter = { |
||||
"/login", |
||||
"/system", "/decision/file", |
||||
"/decision/resources", "/remote","/view/report" |
||||
}; |
||||
private static HashMap<String, String> ROLE_MAP; |
||||
|
||||
static { |
||||
ROLE_MAP = new HashMap<>(); |
||||
ROLE_MAP.put("1", "企业管理员"); |
||||
ROLE_MAP.put("2", "个人用户"); |
||||
ROLE_MAP.put("3", "企业操作员"); |
||||
ROLE_MAP.put("4", "政府端用户"); |
||||
} |
||||
|
||||
@Override |
||||
public String filterName() { |
||||
return "sxka"; |
||||
} |
||||
|
||||
@Override |
||||
public String[] urlPatterns() { |
||||
return new String[]{"/*"}; |
||||
} |
||||
|
||||
@Override |
||||
public void doFilter(HttpServletRequest req, HttpServletResponse res, FilterChain filterChain) { |
||||
if(req.getRequestURI().endsWith("/test/error")){ |
||||
setError(res); |
||||
return; |
||||
} |
||||
if (req.getRequestURI().endsWith("/admin/login")) { |
||||
try { |
||||
String page = new LoginResource().page(req, res); |
||||
if (StringUtils.isBlank(page)) { |
||||
return; |
||||
} |
||||
PrintWriter writer = WebUtils.createPrintWriter(res); |
||||
writer.println(page); |
||||
writer.flush(); |
||||
writer.close(); |
||||
} catch (Exception e) { |
||||
FineLoggerFactory.getLogger().error(e.getMessage(), e); |
||||
} |
||||
return; |
||||
} |
||||
//登录页面跳转地址拦截
|
||||
String origin = WebUtils.getHTTPRequestParameter(req, "origin"); |
||||
if (req.getRequestURI().endsWith("decision/login") && "get".equalsIgnoreCase(req.getMethod())) { |
||||
String state = this.getUserStateFromCookie(req, res); |
||||
|
||||
try { |
||||
if (StringUtils.isNotBlank(origin)) { |
||||
OriginUrlResponseBean path = DecisionStatusService.originUrlStatusService().get(origin); |
||||
cacheParam(res, path.getOriginUrl()); |
||||
} |
||||
res.sendRedirect(buildAuthorizeUrl(state)); |
||||
} catch (Exception e) { |
||||
FineLoggerFactory.getLogger().error(e.getMessage(), e); |
||||
} |
||||
} |
||||
if (isLogin(req) || isAccept(req)) { |
||||
filter(req, res, filterChain); |
||||
return; |
||||
} |
||||
String state = this.getUserStateFromCookie(req, res); |
||||
String code = req.getParameter("code"); |
||||
if (StringUtils.isNotBlank(code)) { |
||||
JSONObject data = acquireAccessToken(code); |
||||
FineLoggerFactory.getLogger().info("get access_token is {}", data); |
||||
// 计算过期时间
|
||||
int expires = Integer.valueOf(data.get("expires_in").toString()); |
||||
Date expiresTime = new Date(System.currentTimeMillis() + (expires * 1000)); |
||||
data.put("expires_at", expiresTime); |
||||
// 保存关系映射
|
||||
putState(state, data); |
||||
} |
||||
JSONObject tokenItem = null; |
||||
try { |
||||
tokenItem = DecisionStatusService.loginStatusService().get(state); |
||||
} catch (Exception e) { |
||||
FineLoggerFactory.getLogger().error(e.getMessage(),e); |
||||
} |
||||
if (tokenItem == null) { |
||||
try { |
||||
String jump = req.getRequestURL() + (req.getQueryString() == null ? StringUtils.EMPTY : "?" + req.getQueryString()); |
||||
cacheParam(res, jump); |
||||
res.sendRedirect(buildAuthorizeUrl(state)); |
||||
return; |
||||
} catch (Exception e) { |
||||
FineLoggerFactory.getLogger().error(e.getMessage(), e); |
||||
} |
||||
} |
||||
// 用检查 access token 是否过期
|
||||
Date tokenExpiresAt = (Date) tokenItem.get("expires_at"); |
||||
Date now = new Date(); |
||||
if (tokenExpiresAt.before(now)) { |
||||
// 使用 refresh token 刷新 access token
|
||||
String refreshToken = tokenItem.get("refresh_token").toString(); |
||||
tokenItem = this.refreshToken(refreshToken); |
||||
putState(state, tokenItem); |
||||
} |
||||
String accessToken = tokenItem.get("access_token").toString(); |
||||
JSONObject userProfile = this.acquireUserInfo(state, accessToken); |
||||
try { |
||||
if (!existUser(userProfile.getString("id"))) { |
||||
FineLoggerFactory.getLogger().info("user {} not exist ", userProfile.getString("id")); |
||||
UserBean userBean = new UserBean(); |
||||
userBean.setUsername(userProfile.getString("id")); |
||||
userBean.setRealName(userProfile.getString("op_name")); |
||||
userBean.setEnable(true); |
||||
userBean.setPassword(TransmissionEncryptors.getInstance().encrypt("!234Qwer")); |
||||
UserService.getInstance().addUser(userBean); |
||||
} |
||||
UserInfoEntity infoEntity = recordUserInfo(userProfile); |
||||
if(checkAuth(infoEntity, req, res)){ |
||||
return; |
||||
} |
||||
} catch (Exception e) { |
||||
FineLoggerFactory.getLogger().error(e.getMessage(), e); |
||||
} |
||||
filter(req, res, filterChain); |
||||
} |
||||
|
||||
private void putState(String state, JSONObject data) { |
||||
try { |
||||
DecisionStatusService.loginStatusService().put(state, data); |
||||
} catch (Exception e) { |
||||
FineLoggerFactory.getLogger().error(e.getMessage(),e); |
||||
} |
||||
} |
||||
|
||||
private void cacheParam(HttpServletResponse res, String jump) { |
||||
String id = UUID.randomUUID().toString(); |
||||
try { |
||||
DecisionStatusService.originUrlStatusService().put(id, new OriginUrlResponseBean(jump));//添加重定向地址
|
||||
} catch (Exception e) { |
||||
FineLoggerFactory.getLogger().error(e.getMessage(), e); |
||||
} |
||||
Cookie cookie = new Cookie("ORIGIN_URL", id); |
||||
cookie.setPath("/"); |
||||
cookie.setMaxAge(60); |
||||
cookie.setHttpOnly(true); |
||||
res.addCookie(cookie); |
||||
} |
||||
|
||||
private boolean checkAuth(UserInfoEntity entity, HttpServletRequest req, HttpServletResponse res) throws Exception { |
||||
if (StringUtils.isNotBlank(entity.getStatus()) && entity.getStatus().equalsIgnoreCase("true")) { |
||||
if (entity.getAccount_type().equals("1") || entity.getAccount_type().equals("3") || entity.getAccount_type().equals("4")) { |
||||
UserBean userAccount = UserService.getInstance().getUserAccount(entity.getId()); |
||||
String roleName = ROLE_MAP.containsKey(entity.getAccount_type()) ? ROLE_MAP.get(entity.getAccount_type()) : "其他"; |
||||
CustomRole role = AuthorityContext.getInstance().getCustomRoleController().findOne(QueryFactory.create().addRestriction(RestrictionFactory.eq("name", roleName))); |
||||
if (role != null) { |
||||
List<CustomRole> oldRoleList = AuthorityContext.getInstance().getCustomRoleController().findByUser(userAccount.getId(), QueryFactory.create()); |
||||
oldRoleList.forEach(e->{ |
||||
try { |
||||
AuthorityContext.getInstance().getUserController().removeUserFromCustomRole(userAccount.getId(), e.getId()); |
||||
} catch (Exception exception) { |
||||
FineLoggerFactory.getLogger().error(exception.getMessage(),exception); |
||||
} |
||||
}); |
||||
AuthorityContext.getInstance().getUserController().addUserToCustomRole(userAccount.getId(),role.getId()); |
||||
} |
||||
} |
||||
loginFromToken(req, res, entity.getId()); |
||||
String jump = getOrigin(req); |
||||
FineLoggerFactory.getLogger().info("get Origin path is {}", jump); |
||||
if (StringUtils.isNotBlank(jump)) { |
||||
res.sendRedirect(jump); |
||||
return true; |
||||
} |
||||
return false; |
||||
} |
||||
if(entity.getAccount_type().equals("1") || entity.getAccount_type().equals("3") || entity.getAccount_type().equals("4")){ |
||||
setError(res); |
||||
return true; |
||||
} |
||||
String url = PropertiesUtils.getProperties("conf").getProperty("write_report"); |
||||
String param = "username="+ URLEncoder.encode(entity.getOp_name(),"UTF-8")+"&id="+entity.getId(); |
||||
url = url.indexOf("?") != -1?url+"&"+param:url+"?"+param; |
||||
res.sendRedirect(url); |
||||
return true; |
||||
} |
||||
|
||||
|
||||
|
||||
private String getOrigin(HttpServletRequest req) throws Exception { |
||||
Cookie[] cookies = req.getCookies(); |
||||
if (cookies == null) { |
||||
return null; |
||||
} |
||||
for (int i = 0; i < cookies.length; i++) { |
||||
if ("ORIGIN_URL".equals(cookies[i].getName())) { |
||||
String id = cookies[i].getValue(); |
||||
OriginUrlResponseBean path = DecisionStatusService.originUrlStatusService().get(id); |
||||
if (path != null) { |
||||
DecisionStatusService.originUrlStatusService().delete(id); |
||||
return path.getOriginUrl(); |
||||
} |
||||
} |
||||
} |
||||
return StringUtils.EMPTY; |
||||
} |
||||
|
||||
private UserInfoEntity recordUserInfo(JSONObject user) { |
||||
ObjectMapper mapper = EmbedJson.MAPPER.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false); |
||||
UserInfoEntity entity = mapper.convertValue(user, UserInfoEntity.class); |
||||
try { |
||||
return RoleDBAccessProvider.getDbAccessor().runDMLAction(new DBAction<UserInfoEntity>() { |
||||
@Override |
||||
public UserInfoEntity run(DAOContext daoContext) throws Exception { |
||||
UserInfoDao dao = daoContext.getDAO(UserInfoDao.class); |
||||
UserInfoEntity byId = dao.getById(entity.getId()); |
||||
if (byId != null) { |
||||
entity.setStatus(byId.getStatus()); |
||||
entity.setAccount_type(byId.getAccount_type()); |
||||
} else { |
||||
entity.setStatus("false"); |
||||
} |
||||
dao.addOrUpdate(entity); |
||||
return entity; |
||||
} |
||||
}); |
||||
} catch (Exception e) { |
||||
FineLoggerFactory.getLogger().error(e.getMessage(), e); |
||||
} |
||||
return entity; |
||||
|
||||
} |
||||
|
||||
private boolean existUser(String username) { |
||||
User user = null; |
||||
try { |
||||
user = UserService.getInstance().getUserByUserName(username); |
||||
} catch (Exception e) { |
||||
FineLoggerFactory.getLogger().error(e.getMessage(), e); |
||||
} |
||||
return user != null; |
||||
} |
||||
|
||||
private boolean loginFromToken(HttpServletRequest req, HttpServletResponse res, String username) throws Exception { |
||||
try { |
||||
if (StringUtils.isNotEmpty(username)) { |
||||
FineLoggerFactory.getLogger().info("current username:" + username); |
||||
User user = UserService.getInstance().getUserByUserName(username); |
||||
FineLoggerFactory.getLogger().info("get user:" + user); |
||||
if (user == null) { |
||||
throw new UserNotExistException(); |
||||
} |
||||
String token = LoginService.getInstance().login(req, res, username); |
||||
FineLoggerFactory.getLogger().info("get login token:" + token); |
||||
req.setAttribute(DecisionServiceConstants.FINE_AUTH_TOKEN_NAME, token); |
||||
FineLoggerFactory.getLogger().info("username:" + username + "login success"); |
||||
return true; |
||||
} else { |
||||
FineLoggerFactory.getLogger().warn("username is null!"); |
||||
return false; |
||||
} |
||||
} catch (Exception e) { |
||||
FineLoggerFactory.getLogger().error(e.getMessage(), e); |
||||
} |
||||
return false; |
||||
} |
||||
|
||||
|
||||
private JSONObject acquireUserInfo(String state, String accessToken) { |
||||
String url = PropertiesUtils.getProperties("conf").getProperty("user_url"); |
||||
|
||||
Map<String, String> params = new HashMap<>(); |
||||
params.put("client_id", PropertiesUtils.getProperties("conf").getProperty("client_id")); |
||||
params.put("access_token", accessToken); |
||||
HttpHeaders headers = new HttpHeaders(); |
||||
headers.setContentType(MediaType.APPLICATION_FORM_URLENCODED); |
||||
try { |
||||
String res = HttpToolbox.executeAndParse(HttpRequest.custom().url(url) |
||||
.headers(headers.toSingleValueMap()) |
||||
.post(params) |
||||
.build()); |
||||
FineLoggerFactory.getLogger().info("get user name url is 【{}】,params is,{} res is {}", url, params, res); |
||||
JSONObject object = new JSONObject(res); |
||||
return object.getJSONObject("data"); |
||||
} catch (IOException e) { |
||||
FineLoggerFactory.getLogger().error(e.getMessage(), e); |
||||
} |
||||
return JSONObject.EMPTY; |
||||
} |
||||
|
||||
private JSONObject refreshToken(String refreshToken) { |
||||
String url = PropertiesUtils.getProperties("conf").getProperty("token_url"); |
||||
|
||||
Map<String, String> params = new HashMap<>(); |
||||
params.put("grant_type", "refresh_token"); |
||||
params.put("refresh_token", refreshToken); |
||||
params.put("client_id", PropertiesUtils.getProperties("conf").getProperty("client_id")); |
||||
params.put("client_sign", this.makeSign(refreshToken)); |
||||
HttpHeaders headers = new HttpHeaders(); |
||||
headers.setContentType(MediaType.APPLICATION_FORM_URLENCODED); |
||||
try { |
||||
String res = HttpToolbox.executeAndParse(HttpRequest.custom().url(url) |
||||
.headers(headers.toSingleValueMap()) |
||||
.post(params) |
||||
.build()); |
||||
FineLoggerFactory.getLogger().info("get refresh token url is 【{}】,params is,{} res is {}", url, params, res); |
||||
JSONObject object = new JSONObject(res); |
||||
return object.getJSONObject("data"); |
||||
} catch (IOException e) { |
||||
FineLoggerFactory.getLogger().error(e.getMessage(), e); |
||||
} |
||||
return JSONObject.EMPTY; |
||||
} |
||||
|
||||
private JSONObject acquireAccessToken(String code) { |
||||
String url = PropertiesUtils.getProperties("conf").getProperty("token_url"); |
||||
Map<String, String> params = new HashMap<>(); |
||||
params.put("grant_type", "authorization_code"); |
||||
params.put("code", code); |
||||
params.put("client_id", PropertiesUtils.getProperties("conf").getProperty("client_id")); |
||||
params.put("client_sign", this.makeSign(code)); |
||||
HttpHeaders headers = new HttpHeaders(); |
||||
headers.setContentType(MediaType.APPLICATION_FORM_URLENCODED); |
||||
try { |
||||
String res = HttpToolbox.executeAndParse(HttpRequest.custom().url(url) |
||||
.headers(headers.toSingleValueMap()) |
||||
.post(params) |
||||
.build()); |
||||
FineLoggerFactory.getLogger().info("get access token url is 【{}】,params is,{} res is {}", url, params, res); |
||||
JSONObject object = new JSONObject(res); |
||||
return object.getJSONObject("data"); |
||||
} catch (IOException e) { |
||||
FineLoggerFactory.getLogger().error(e.getMessage(), e); |
||||
} |
||||
return JSONObject.EMPTY; |
||||
} |
||||
|
||||
/** |
||||
* 生成签名值= md5Hex("<client_id>$<data>$<client_secret>", UTF8) |
||||
* |
||||
* @param data |
||||
* @return |
||||
*/ |
||||
private String makeSign(String data) { |
||||
String value = String.join("$", new String[]{ |
||||
PropertiesUtils.getProperties("conf").getProperty("client_id"), |
||||
data, |
||||
PropertiesUtils.getProperties("conf").getProperty("client_secret") |
||||
}); |
||||
return DigestUtils.md5DigestAsHex(value.getBytes(StandardCharsets.UTF_8)); |
||||
} |
||||
|
||||
private String buildAuthorizeUrl(String state) { |
||||
String format = "%s?client_id=%s&response_type=code&scope=A1,C1,C2&state=%s&redirect_uri=%s"; |
||||
return String.format(format, PropertiesUtils.getProperties("conf").getProperty("auth_url"), PropertiesUtils.getProperties("conf").getProperty("client_id"), state, PropertiesUtils.getProperties("conf").getProperty("redirect_uri")); |
||||
} |
||||
|
||||
private void setUserStateCookie(HttpServletResponse response, String state) { |
||||
Cookie cookie = new Cookie("uid_state", state); |
||||
cookie.setMaxAge(300); |
||||
// 正式环境采用HTTPS协议,需要取消下方注释,确保仅在HTTPS下可用
|
||||
// cookie.setSecure(true);
|
||||
cookie.setPath("/"); |
||||
response.addCookie(cookie); |
||||
} |
||||
|
||||
private String getUserStateFromCookie(HttpServletRequest request, HttpServletResponse res) { |
||||
if (request.getCookies() == null) return null; |
||||
|
||||
String state = StringUtils.EMPTY; |
||||
for (Cookie cookie : request.getCookies()) { |
||||
if ("uid_state".equals(cookie.getName())) { |
||||
state = cookie.getValue(); |
||||
} |
||||
} |
||||
if (StringUtils.isBlank(state)) { |
||||
state = UUID.randomUUID().toString(); |
||||
this.setUserStateCookie(res, state); |
||||
} |
||||
return state; |
||||
} |
||||
|
||||
private boolean isAccept(HttpServletRequest req) { |
||||
for (int i = 0; i < notFilter.length; i++) { |
||||
if (req.getRequestURI().contains(notFilter[i])) { |
||||
return true; |
||||
} |
||||
} |
||||
if (req.getRequestURI().endsWith("/.css") || req.getRequestURI().endsWith("/.css")) { |
||||
return true; |
||||
} |
||||
return false; |
||||
} |
||||
|
||||
private boolean isLogin(HttpServletRequest request) { |
||||
String oldToken = TokenResource.COOKIE.getToken(request); |
||||
return oldToken != null && checkTokenValid(request, (String) oldToken); |
||||
} |
||||
|
||||
private boolean checkTokenValid(HttpServletRequest req, String token) { |
||||
try { |
||||
Device device = NetworkHelper.getDevice(req); |
||||
LoginService.getInstance().loginStatusValid(token, TerminalHandler.getTerminal(req, device)); |
||||
return true; |
||||
} catch (Exception ignore) { |
||||
} |
||||
return false; |
||||
} |
||||
|
||||
private void setError(HttpServletResponse res) { |
||||
try { |
||||
PrintWriter printWriter = WebUtils.createPrintWriter(res); |
||||
Map<String, Object> map = new HashMap<>(); |
||||
map.put("result", InterProviderFactory.getProvider().getLocText("Fine-Engine_Error_Page_Result")); |
||||
map.put("reason", "当前用户已冻结,请联系系统管理员激活"); |
||||
map.put("solution", InterProviderFactory.getProvider().getLocText("Fine-Engine_Please_Contact_Platform_Admin")); |
||||
String page = WebServiceUtils.parseWebPageResourceSafe("com/fr/web/controller/decision/entrance/resources/unavailable.html", map); |
||||
printWriter.write(page); |
||||
printWriter.flush(); |
||||
printWriter.close(); |
||||
} catch (Exception e) { |
||||
FineLoggerFactory.getLogger().error(e.getMessage(), e); |
||||
} |
||||
} |
||||
|
||||
private void filter(HttpServletRequest req, HttpServletResponse res, FilterChain filterChain) { |
||||
try { |
||||
filterChain.doFilter(req, res); |
||||
} catch (IOException e) { |
||||
FineLoggerFactory.getLogger().error(e.getMessage(), e); |
||||
} catch (ServletException e) { |
||||
FineLoggerFactory.getLogger().error(e.getMessage(), e); |
||||
} |
||||
} |
||||
} |
@ -0,0 +1,21 @@
|
||||
package com.fr.plugin.sxka.sso.dao; |
||||
|
||||
import com.fr.plugin.sxka.sso.entity.UserInfoEntity; |
||||
import com.fr.stable.db.dao.BaseDAO; |
||||
import com.fr.stable.db.session.DAOSession; |
||||
|
||||
/** |
||||
* @Author fr.open |
||||
* @Date 2021/5/17 |
||||
* @Description |
||||
**/ |
||||
public class UserInfoDao extends BaseDAO<UserInfoEntity> { |
||||
public UserInfoDao(DAOSession daoSession) { |
||||
super(daoSession); |
||||
} |
||||
|
||||
@Override |
||||
protected Class<UserInfoEntity> getEntityClass() { |
||||
return UserInfoEntity.class; |
||||
} |
||||
} |
@ -0,0 +1,297 @@
|
||||
package com.fr.plugin.sxka.sso.entity; |
||||
|
||||
import com.fr.stable.db.entity.BaseEntity; |
||||
import com.fr.third.javax.persistence.Column; |
||||
import com.fr.third.javax.persistence.Entity; |
||||
import com.fr.third.javax.persistence.Table; |
||||
|
||||
/** |
||||
* @Author fr.open |
||||
* @Date 2021/5/13 |
||||
* @Description |
||||
**/ |
||||
@Entity |
||||
@Table(name = "plugin_sxka_user_info") |
||||
public class UserInfoEntity extends BaseEntity { |
||||
|
||||
private static final long serialVersionUID = 5278704449983309952L; |
||||
|
||||
@Column(name = "op_name") |
||||
private String op_name; |
||||
|
||||
@Column(name = "organization") |
||||
private String organization; |
||||
|
||||
@Column(name = "account_type") |
||||
private String account_type; |
||||
|
||||
@Column(name = "login_type") |
||||
private String login_type; |
||||
|
||||
@Column(name = "gs_name") |
||||
private String gs_name; |
||||
|
||||
@Column(name = "gs_name_en") |
||||
private String gs_name_en; |
||||
|
||||
@Column(name = "gs_type") |
||||
private String gs_type; |
||||
|
||||
@Column(name = "gs_address") |
||||
private String gs_address; |
||||
|
||||
@Column(name = "gs_address_en") |
||||
private String gs_address_en; |
||||
|
||||
@Column(name = "gs_tax_code") |
||||
private String gs_tax_code; |
||||
|
||||
@Column(name = "gs_expires") |
||||
private String gs_expires; |
||||
|
||||
@Column(name = "gs_postcode") |
||||
private String gs_postcode; |
||||
|
||||
@Column(name = "gs_scope") |
||||
private String gs_scope; |
||||
|
||||
@Column(name = "gs_status") |
||||
private String gs_status; |
||||
|
||||
@Column(name = "gs_regcap") |
||||
private String gs_regcap; |
||||
|
||||
@Column(name = "gs_regcap_cur") |
||||
private String gs_regcap_cur; |
||||
|
||||
@Column(name = "gs_social_credit_code") |
||||
private String gs_social_credit_code; |
||||
|
||||
@Column(name = "gs_code") |
||||
private String gs_code; |
||||
|
||||
@Column(name = "gs_regorg") |
||||
private String gs_regorg; |
||||
|
||||
@Column(name = "gs_reg_number") |
||||
private String gs_reg_number; |
||||
|
||||
@Column(name = "gs_location") |
||||
private String gs_location; |
||||
|
||||
@Column(name = "cus_number") |
||||
private String cus_number; |
||||
|
||||
@Column(name = "cus_expires") |
||||
private String cus_expires; |
||||
|
||||
@Column(name = "cus_master") |
||||
private String cus_master; |
||||
|
||||
@Column(name = "status") |
||||
private String status; |
||||
|
||||
public static long getSerialVersionUID() { |
||||
return serialVersionUID; |
||||
} |
||||
|
||||
public String getOp_name() { |
||||
return op_name; |
||||
} |
||||
|
||||
public void setOp_name(String op_name) { |
||||
this.op_name = op_name; |
||||
} |
||||
|
||||
public String getOrganization() { |
||||
return organization; |
||||
} |
||||
|
||||
public void setOrganization(String organization) { |
||||
this.organization = organization; |
||||
} |
||||
|
||||
public String getAccount_type() { |
||||
return account_type; |
||||
} |
||||
|
||||
public void setAccount_type(String account_type) { |
||||
this.account_type = account_type; |
||||
} |
||||
|
||||
public String getLogin_type() { |
||||
return login_type; |
||||
} |
||||
|
||||
public void setLogin_type(String login_type) { |
||||
this.login_type = login_type; |
||||
} |
||||
|
||||
public String getGs_name() { |
||||
return gs_name; |
||||
} |
||||
|
||||
public void setGs_name(String gs_name) { |
||||
this.gs_name = gs_name; |
||||
} |
||||
|
||||
public String getGs_name_en() { |
||||
return gs_name_en; |
||||
} |
||||
|
||||
public void setGs_name_en(String gs_name_en) { |
||||
this.gs_name_en = gs_name_en; |
||||
} |
||||
|
||||
public String getGs_type() { |
||||
return gs_type; |
||||
} |
||||
|
||||
public void setGs_type(String gs_type) { |
||||
this.gs_type = gs_type; |
||||
} |
||||
|
||||
public String getGs_address() { |
||||
return gs_address; |
||||
} |
||||
|
||||
public void setGs_address(String gs_address) { |
||||
this.gs_address = gs_address; |
||||
} |
||||
|
||||
public String getGs_address_en() { |
||||
return gs_address_en; |
||||
} |
||||
|
||||
public void setGs_address_en(String gs_address_en) { |
||||
this.gs_address_en = gs_address_en; |
||||
} |
||||
|
||||
public String getGs_tax_code() { |
||||
return gs_tax_code; |
||||
} |
||||
|
||||
public void setGs_tax_code(String gs_tax_code) { |
||||
this.gs_tax_code = gs_tax_code; |
||||
} |
||||
|
||||
public String getGs_expires() { |
||||
return gs_expires; |
||||
} |
||||
|
||||
public void setGs_expires(String gs_expires) { |
||||
this.gs_expires = gs_expires; |
||||
} |
||||
|
||||
public String getGs_postcode() { |
||||
return gs_postcode; |
||||
} |
||||
|
||||
public void setGs_postcode(String gs_postcode) { |
||||
this.gs_postcode = gs_postcode; |
||||
} |
||||
|
||||
public String getGs_scope() { |
||||
return gs_scope; |
||||
} |
||||
|
||||
public void setGs_scope(String gs_scope) { |
||||
this.gs_scope = gs_scope; |
||||
} |
||||
|
||||
public String getGs_status() { |
||||
return gs_status; |
||||
} |
||||
|
||||
public void setGs_status(String gs_status) { |
||||
this.gs_status = gs_status; |
||||
} |
||||
|
||||
public String getGs_regcap() { |
||||
return gs_regcap; |
||||
} |
||||
|
||||
public void setGs_regcap(String gs_regcap) { |
||||
this.gs_regcap = gs_regcap; |
||||
} |
||||
|
||||
public String getGs_regcap_cur() { |
||||
return gs_regcap_cur; |
||||
} |
||||
|
||||
public void setGs_regcap_cur(String gs_regcap_cur) { |
||||
this.gs_regcap_cur = gs_regcap_cur; |
||||
} |
||||
|
||||
public String getGs_social_credit_code() { |
||||
return gs_social_credit_code; |
||||
} |
||||
|
||||
public void setGs_social_credit_code(String gs_social_credit_code) { |
||||
this.gs_social_credit_code = gs_social_credit_code; |
||||
} |
||||
|
||||
public String getGs_code() { |
||||
return gs_code; |
||||
} |
||||
|
||||
public void setGs_code(String gs_code) { |
||||
this.gs_code = gs_code; |
||||
} |
||||
|
||||
public String getGs_regorg() { |
||||
return gs_regorg; |
||||
} |
||||
|
||||
public void setGs_regorg(String gs_regorg) { |
||||
this.gs_regorg = gs_regorg; |
||||
} |
||||
|
||||
public String getGs_reg_number() { |
||||
return gs_reg_number; |
||||
} |
||||
|
||||
public void setGs_reg_number(String gs_reg_number) { |
||||
this.gs_reg_number = gs_reg_number; |
||||
} |
||||
|
||||
public String getGs_location() { |
||||
return gs_location; |
||||
} |
||||
|
||||
public void setGs_location(String gs_location) { |
||||
this.gs_location = gs_location; |
||||
} |
||||
|
||||
public String getCus_number() { |
||||
return cus_number; |
||||
} |
||||
|
||||
public void setCus_number(String cus_number) { |
||||
this.cus_number = cus_number; |
||||
} |
||||
|
||||
public String getCus_expires() { |
||||
return cus_expires; |
||||
} |
||||
|
||||
public void setCus_expires(String cus_expires) { |
||||
this.cus_expires = cus_expires; |
||||
} |
||||
|
||||
public String getCus_master() { |
||||
return cus_master; |
||||
} |
||||
|
||||
public void setCus_master(String cus_master) { |
||||
this.cus_master = cus_master; |
||||
} |
||||
|
||||
public String getStatus() { |
||||
return status; |
||||
} |
||||
|
||||
public void setStatus(String status) { |
||||
this.status = status; |
||||
} |
||||
} |
@ -0,0 +1,16 @@
|
||||
#\u5355\u70B9\u767B\u5F55\u7EDF\u4E00\u5730\u5740 |
||||
auth_url=https://www.singlewindow.shaanxi.cn/oauth/authorize |
||||
#\u83B7\u53D6tokan\u5730\u5740 |
||||
token_url=https://www.singlewindow.shaanxi.cn/oauth/token |
||||
#\u83B7\u53D6\u7528\u6237\u4FE1\u606F\u63A5\u53E3 |
||||
user_url=https://www.singlewindow.shaanxi.cn/resource/user |
||||
#client_id |
||||
client_id=125d5ff7-a40a-11eb-8e31-005056826ea5 |
||||
#client_secret |
||||
client_secret=93badcc315cf94843040c2d9f254094f6eb71e0f |
||||
#\u767B\u51FA\u540E\u8DF3\u8F6C\u5730\u5740 |
||||
logout=https://www.singlewindow.shaanxi.cn/oauth/logout |
||||
##\u56DE\u8C03\u5730\u5740 |
||||
redirect_uri=http://locahost:8075/webroot/decision |
||||
##\u586B\u62A5\u5730\u5740 |
||||
write_report= |
Binary file not shown.
Loading…
Reference in new issue