diff --git a/api/src/main/java/com/lktx/center/config/AllException.java b/api/src/main/java/com/lktx/center/config/AllException.java new file mode 100644 index 0000000..0125ab6 --- /dev/null +++ b/api/src/main/java/com/lktx/center/config/AllException.java @@ -0,0 +1,17 @@ +package com.lktx.center.config; + +import cn.dev33.satoken.exception.NotLoginException; +import cn.hserver.core.ioc.annotation.Bean; +import cn.hserver.core.server.util.JsonResult; +import cn.hserver.plugin.web.context.Webkit; +import cn.hserver.plugin.web.interfaces.GlobalException; + +@Bean +public class AllException implements GlobalException { + @Override + public void handler(Throwable throwable, int httpStatusCode, String errorDescription, Webkit webkit) { + if (throwable.getCause() instanceof NotLoginException){ + webkit.httpResponse.sendJson(JsonResult.error(-2, errorDescription)); + } + } +} diff --git a/api/src/main/java/com/lktx/center/controller/AppCenterController.java b/api/src/main/java/com/lktx/center/controller/AppCenterController.java new file mode 100644 index 0000000..c4a0763 --- /dev/null +++ b/api/src/main/java/com/lktx/center/controller/AppCenterController.java @@ -0,0 +1,27 @@ +package com.lktx.center.controller; + +import cn.dev33.satoken.annotation.SaCheckLogin; +import cn.hserver.core.ioc.annotation.Autowired; +import cn.hserver.core.server.util.JsonResult; +import cn.hserver.plugin.web.annotation.Controller; +import cn.hserver.plugin.web.annotation.GET; +import com.lktx.center.service.AppCenterService; + +import java.util.Map; + +@Controller("/app-center") +public class AppCenterController { + + @Autowired + private AppCenterService appCenterService; + + @GET("/list") + @SaCheckLogin + public JsonResult list(){ + Map appList = appCenterService.getAppList(); + if (appList != null) { + return JsonResult.ok().put("data", appList); + } + return JsonResult.error(); + } +} diff --git a/api/src/main/java/com/lktx/center/controller/HomeController.java b/api/src/main/java/com/lktx/center/controller/HomeController.java index ae94d12..2fb061d 100644 --- a/api/src/main/java/com/lktx/center/controller/HomeController.java +++ b/api/src/main/java/com/lktx/center/controller/HomeController.java @@ -52,19 +52,4 @@ public class HomeController { } - @GET("/logout") - public void logout(HttpResponse response) { - if (StpUtil.isLogin()){ - //可以全局退出 - SaSession session = StpUtil.getSession(); - AuthToken authToken = session.get(Data.AuthToken,null); - if (authToken != null){ - AuthResponse revoke = authRequest.revoke(authToken); - System.out.println(revoke.getMsg()); - } - //子系统退出 - StpUtil.logout(); - } - response.redirect("/"); - } } diff --git a/api/src/main/java/com/lktx/center/controller/RestAuthController.java b/api/src/main/java/com/lktx/center/controller/RestAuthController.java index 832ab6b..0241393 100644 --- a/api/src/main/java/com/lktx/center/controller/RestAuthController.java +++ b/api/src/main/java/com/lktx/center/controller/RestAuthController.java @@ -5,11 +5,13 @@ import cn.dev33.satoken.stp.StpUtil; import cn.hserver.core.ioc.annotation.Autowired; import cn.hserver.core.server.util.JsonResult; import cn.hserver.plugin.web.annotation.Controller; +import cn.hserver.plugin.web.annotation.GET; import cn.hserver.plugin.web.annotation.RequestMapping; import cn.hserver.plugin.web.interfaces.HttpRequest; import cn.hserver.plugin.web.interfaces.HttpResponse; import com.lktx.center.config.Data; import com.lktx.center.config.SsoAuthRequest; +import com.lktx.center.domain.vo.LoginInfo; import lombok.extern.slf4j.Slf4j; import me.zhyd.oauth.model.AuthCallback; import me.zhyd.oauth.model.AuthResponse; @@ -41,10 +43,36 @@ public class RestAuthController { StpUtil.login(login.getData().getUuid()); SaSession session = StpUtil.getSession(); session.set(Data.AuthToken, token); - return JsonResult.ok().put("data", data); + + LoginInfo build = LoginInfo.builder() + .userId(data.getUuid()) + .avatar(data.getAvatar()) + .username(data.getUsername()) + .nickname(data.getNickname()) + .token(StpUtil.getTokenInfo().tokenValue) + .build(); + + return JsonResult.ok().put("data", build); }catch (Exception e) { log.error("login error",e); } return JsonResult.error(); } + + + @GET("/logout") + public JsonResult logout() { + System.out.println(StpUtil.getSession().getId()); + if (StpUtil.isLogin()){ + SaSession session = StpUtil.getSession(); + AuthToken authToken = session.get(Data.AuthToken,null); + if (authToken != null){ + AuthResponse revoke = authRequest.revoke(authToken); + System.out.println(revoke.getMsg()); + } + //子系统退出 + StpUtil.logout(); + } + return JsonResult.ok(); + } } \ No newline at end of file diff --git a/api/src/main/java/com/lktx/center/domain/vo/LoginInfo.java b/api/src/main/java/com/lktx/center/domain/vo/LoginInfo.java new file mode 100644 index 0000000..90b2ab4 --- /dev/null +++ b/api/src/main/java/com/lktx/center/domain/vo/LoginInfo.java @@ -0,0 +1,14 @@ +package com.lktx.center.domain.vo; + +import lombok.Builder; +import lombok.Data; + +@Data +@Builder +public class LoginInfo { + private String userId; + private String nickname; + private String username; + private String avatar; + private String token; +} diff --git a/api/src/main/java/com/lktx/center/service/AppCenterService.java b/api/src/main/java/com/lktx/center/service/AppCenterService.java new file mode 100644 index 0000000..6973ecb --- /dev/null +++ b/api/src/main/java/com/lktx/center/service/AppCenterService.java @@ -0,0 +1,58 @@ +package com.lktx.center.service; + +import cn.dev33.satoken.session.SaSession; +import cn.dev33.satoken.stp.StpUtil; +import cn.hserver.core.ioc.annotation.Autowired; +import cn.hserver.core.ioc.annotation.Bean; +import cn.hserver.core.server.util.JsonResult; +import com.google.common.cache.Cache; +import com.google.common.cache.CacheBuilder; +import com.lktx.center.config.Data; +import com.lktx.center.config.SsoAuthRequest; +import com.lktx.center.domain.bean.SsoApp; +import com.lktx.center.domain.vo.SsoUserAppVO; +import me.zhyd.oauth.model.AuthResponse; +import me.zhyd.oauth.model.AuthToken; + +import java.util.Map; +import java.util.concurrent.TimeUnit; +import java.util.stream.Collectors; + +@Bean +public class AppCenterService { + + + @Autowired + private SsoAuthRequest ssoAuthRequest; + + + private final Cache> expiringCache = CacheBuilder.newBuilder() + .expireAfterWrite(30, TimeUnit.MINUTES) // 写入后30分钟过期 + .maximumSize(1) + .build(); + + public Map getAppList(){ + Map appList = expiringCache.getIfPresent("appList"); + if(appList != null){ + return appList; + } + SaSession session = StpUtil.getSession(); + AuthToken authToken = session.get(Data.AuthToken,null); + if (authToken != null){ + AuthResponse center = ssoAuthRequest.center(authToken); + if (center.ok()) { + Map data = Map.of( + "user", center.getData().getSsoUser(), + "appList", center.getData().getSsoAppList(), + "appGroup", center.getData().getSsoAppList().stream().map(SsoApp::getSsoAppGroup).collect(Collectors.toSet()) + ); + expiringCache.put("appList", data); + return data; + } + } + return null; + } + + + +} diff --git a/web/src/api/appcenter.js b/web/src/api/appcenter.js new file mode 100644 index 0000000..8b1d0f1 --- /dev/null +++ b/web/src/api/appcenter.js @@ -0,0 +1,8 @@ +import http from '../data/http' + +export function appCenterList() { + return http({ + url: '/app-center/list', + method: 'get', + }) +} diff --git a/web/src/api/login.js b/web/src/api/login.js index 3d16079..516f557 100644 --- a/web/src/api/login.js +++ b/web/src/api/login.js @@ -7,3 +7,9 @@ export function login(data) { data }) } +export function logout() { + return http({ + url: '/oauth/logout', + method: 'get', + }) +} diff --git a/web/src/data/http.js b/web/src/data/http.js index 33a6656..51bd561 100644 --- a/web/src/data/http.js +++ b/web/src/data/http.js @@ -21,7 +21,7 @@ service.interceptors.request.use( // let each request carry token // ['X-Token'] is a custom headers key // please modify it according to the actual situation - config.headers['token'] = userInfo.getUserInfo().token + config.headers['satoken'] = userInfo.getUserInfo().token } return config }, @@ -49,8 +49,9 @@ service.interceptors.response.use( // if the custom code is not 20000, it is judged as an error. if (res.code !== 200) { // 50008: Illegal token; 50012: Other clients logged in; 50014: Token expired; - if (res.code === -2 || res.code === -3 || res.code === -4 || res.code === -5) { + if (res.code === -2) { location.href = "/login" + return null } return res } else { diff --git a/web/src/views/appcenter.vue b/web/src/views/appcenter.vue index 3bfe5f4..2610060 100644 --- a/web/src/views/appcenter.vue +++ b/web/src/views/appcenter.vue @@ -76,7 +76,7 @@
- +

{{ element.name }}

{{ element.description }}

@@ -123,7 +123,7 @@ >
- +

{{ app.name }}

{{ app.description }}

@@ -181,7 +181,7 @@ :label="app.id" class="flex items-center" > - + {{ app.name }} @@ -212,6 +212,7 @@ diff --git a/web/src/views/menu/index.vue b/web/src/views/menu/index.vue index 3892be3..e0c2316 100644 --- a/web/src/views/menu/index.vue +++ b/web/src/views/menu/index.vue @@ -39,8 +39,14 @@
User Avatar - - + + {{ userInfoData?.nickname }} + +
@@ -117,7 +123,7 @@
-