From 0e6eac4fbdfe7fa4908580f4341904d2b9e0eb7a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=BB=84=E6=B5=B7?= <10402852@qq.com> Date: Tue, 17 Dec 2024 13:28:22 +0800 Subject: [PATCH] 'commit' --- src/main/java/com/dsideal/Start.java | 2 + .../sso/Controller/AppLoginController.java | 100 ++++++++++++++++++ src/main/resources/application.properties | 6 -- ...务接入系统集成开发手册V2.01.doc | Bin 244736 -> 244224 bytes 4 files changed, 102 insertions(+), 6 deletions(-) create mode 100644 src/main/java/com/dsideal/sso/Controller/AppLoginController.java rename 统一认证服务接入系统集成开发手册V2.0.doc => 统一认证服务接入系统集成开发手册V2.01.doc (81%) diff --git a/src/main/java/com/dsideal/Start.java b/src/main/java/com/dsideal/Start.java index 0c912bf..b8bc541 100644 --- a/src/main/java/com/dsideal/Start.java +++ b/src/main/java/com/dsideal/Start.java @@ -1,6 +1,7 @@ package com.dsideal; import Plugin.LogBackLogFactory; +import com.dsideal.sso.Controller.AppLoginController; import com.dsideal.sso.Controller.IndexController; import com.dsideal.sso.Interceptor.EmptyInterceptor; import com.jfinal.config.*; @@ -47,6 +48,7 @@ public class Start extends JFinalConfig { me.add("/", IndexController.class); me.add("/web", WebLoginController.class); me.add("/common", CommomController.class); + me.add("/app", AppLoginController.class); } public void configEngine(Engine me) { diff --git a/src/main/java/com/dsideal/sso/Controller/AppLoginController.java b/src/main/java/com/dsideal/sso/Controller/AppLoginController.java new file mode 100644 index 0000000..66de85f --- /dev/null +++ b/src/main/java/com/dsideal/sso/Controller/AppLoginController.java @@ -0,0 +1,100 @@ +package com.dsideal.sso.Controller; + +import java.util.Map; +import java.util.UUID; + +import com.dsideal.sso.Interceptor.EmptyInterface; +import com.dsideal.sso.Util.CommonUtil; +import com.dsideal.sso.Util.SsoLoginHelper; +import com.jfinal.aop.Before; +import com.jfinal.ext.interceptor.POST; +import com.jfinal.kit.StrKit; +import com.alibaba.fastjson.JSONObject; +import com.jfinal.core.Controller; + +public class AppLoginController extends Controller { + /** + * app登录 + * + * @param username 用户名 + * @param password 密码 + */ + @Before({POST.class}) + @EmptyInterface({"username", "password"}) + public void doLogin(String username, String password) { + JSONObject resultJson = new JSONObject(); + String passwordEncode = CommonUtil.getLdapPassword(password); + Map loginMap = CommonUtil.getLoginRouteMap(username); + if (passwordEncode != null && (loginMap == null || !passwordEncode.equals(loginMap.get("password")))) { + resultJson.put("success", false); + resultJson.put("msg", "用户名或密码错误!"); + renderJson(resultJson); + } + + String sessionId = UUID.randomUUID().toString(); + SsoLoginHelper.login(sessionId, loginMap); + resultJson.put("success", true); + resultJson.put("sessionId", sessionId); + if (loginMap != null) { + resultJson.put("personId", loginMap.get("person_id")); + } + if (loginMap != null) { + resultJson.put("personName", loginMap.get("person_name")); + } + if (loginMap != null) { + resultJson.put("bureauId", loginMap.get("bureau_id")); + } + if (loginMap != null) { + resultJson.put("identityId", loginMap.get("identity_id")); + } + renderJson(resultJson); + } + + /** + * 功能:登录检查 + */ + public void loginCheck() { + JSONObject resultJson = new JSONObject(); + boolean flag = true; + if (flag) { + String sessionId = getPara("sessionId"); + if (!sessionId.equals("null") && sessionId != null && sessionId.length() != 0) { + Map loginMap = SsoLoginHelper.loginCheck(sessionId); + if (loginMap == null) { + resultJson.put("success", false); + resultJson.put("msg", "sessionId 已失效!"); + } else { + resultJson.put("success", true); + resultJson.put("sessionId", sessionId); + resultJson.put("personId", loginMap.get("person_id").toString()); + resultJson.put("personName", loginMap.get("person_name").toString()); + resultJson.put("bureauId", loginMap.get("bureau_id").toString()); + resultJson.put("identityId", loginMap.get("identity_id").toString()); + resultJson.put("city_id", loginMap.get("city_id").toString()); + resultJson.put("area_id", loginMap.get("area_id").toString()); + //loginType 1:正常登录 2:切换登录 如果为切换登录main_person_id不能写-1 + String loginType = loginMap.get("login_type").toString(); + if (loginType.equals("1")) { + resultJson.put("mainPersonId", loginMap.get("main_person_id").toString()); + } else { + resultJson.put("mainPersonId", Login.dao.getMainAccountPersonIdByPersonId(loginMap.get("person_id").toString())); + } + } + } else { + resultJson.put("success", false); + resultJson.put("msg", "sessionId 已失效!"); + } + } + renderJson(resultJson); + } + + /** + * app登出 + * + * @throws Exception + */ + public void logout() { + String sessionId = getPara("sessionId"); + SsoLoginHelper.logout(sessionId); + } +} diff --git a/src/main/resources/application.properties b/src/main/resources/application.properties index e209014..da0e9f0 100644 --- a/src/main/resources/application.properties +++ b/src/main/resources/application.properties @@ -8,11 +8,5 @@ redis_ip=10.10.14.14 redis_port=18890 sso.sessionid=ds_sso_sessionid -qq.app.id=101470748 -qq.app.key=5abec826d65379561edbf4458db1de04 -qq.redirect.uri=http://10.10.6.179/third/qqLogin - -wx.app.id=wx3e0449144386938a -wx.app.secret=15a37979f34791ca8b920c386afaa0d5 diff --git a/统一认证服务接入系统集成开发手册V2.0.doc b/统一认证服务接入系统集成开发手册V2.01.doc similarity index 81% rename from 统一认证服务接入系统集成开发手册V2.0.doc rename to 统一认证服务接入系统集成开发手册V2.01.doc index 797437ca26727ad6c3f6807ad4ac120afa30082e..a3a018d0036a92e6833e775c0ec14c538f6650d7 100644 GIT binary patch delta 13302 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 F{tFMIm;e9( delta 14120 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