| | |
| | | package org.dromara.web.controller; |
| | | |
| | | import cn.dev33.satoken.annotation.SaIgnore; |
| | | import cn.dev33.satoken.exception.NotLoginException; |
| | | import cn.hutool.core.codec.Base64; |
| | | import cn.hutool.core.collection.CollUtil; |
| | | import cn.hutool.core.util.ObjectUtil; |
| | | import jakarta.servlet.http.HttpServletRequest; |
| | |
| | | import org.dromara.common.social.config.properties.SocialLoginConfigProperties; |
| | | import org.dromara.common.social.config.properties.SocialProperties; |
| | | import org.dromara.common.social.utils.SocialUtils; |
| | | import org.dromara.common.sse.dto.SseMessageDto; |
| | | import org.dromara.common.sse.utils.SseMessageUtils; |
| | | import org.dromara.common.tenant.helper.TenantHelper; |
| | | import org.dromara.common.websocket.dto.WebSocketMessageDto; |
| | | import org.dromara.common.websocket.utils.WebSocketUtils; |
| | | import org.dromara.system.domain.bo.SysTenantBo; |
| | | import org.dromara.system.domain.vo.SysClientVo; |
| | | import org.dromara.system.domain.vo.SysTenantVo; |
| | |
| | | import org.springframework.web.bind.annotation.*; |
| | | |
| | | import java.net.URL; |
| | | import java.nio.charset.StandardCharsets; |
| | | import java.util.HashMap; |
| | | import java.util.List; |
| | | import java.util.Map; |
| | | import java.util.concurrent.ScheduledExecutorService; |
| | | import java.util.concurrent.TimeUnit; |
| | | |
| | |
| | | return R.fail(MessageUtils.message("auth.grant.type.blocked")); |
| | | } |
| | | // 校验租户 |
| | | SysTenantVo tenant = loginService.checkTenant(loginBody.getTenantId()); |
| | | loginService.checkTenant(loginBody.getTenantId()); |
| | | // 登录 |
| | | LoginVo loginVo = IAuthStrategy.login(body, client, grantType); |
| | | |
| | | Long userId = LoginHelper.getUserId(); |
| | | scheduledExecutorService.schedule(() -> { |
| | | WebSocketMessageDto dto = new WebSocketMessageDto(); |
| | | dto.setMessage("欢迎登录RuoYi-Vue-Plus后台管理系统"); |
| | | dto.setSessionKeys(List.of(userId)); |
| | | WebSocketUtils.publishMessage(dto); |
| | | }, 3, TimeUnit.SECONDS); |
| | | |
| | | if (StringUtils.isNotBlank(tenant.getTenantId())) { |
| | | loginVo.setDomain(tenant.getDomain()); |
| | | } |
| | | SseMessageDto dto = new SseMessageDto(); |
| | | dto.setMessage("欢迎登录兰宝车间质量管理系统"); |
| | | dto.setUserIds(List.of(userId)); |
| | | SseMessageUtils.publishMessage(dto); |
| | | }, 5, TimeUnit.SECONDS); |
| | | return R.ok(loginVo); |
| | | } |
| | | |
| | |
| | | * @return 结果 |
| | | */ |
| | | @GetMapping("/binding/{source}") |
| | | public R<String> authBinding(@PathVariable("source") String source) { |
| | | public R<String> authBinding(@PathVariable("source") String source, |
| | | @RequestParam String tenantId, @RequestParam String domain) { |
| | | SocialLoginConfigProperties obj = socialProperties.getType().get(source); |
| | | if (ObjectUtil.isNull(obj)) { |
| | | return R.fail(source + "平台账号暂不支持"); |
| | | } |
| | | AuthRequest authRequest = SocialUtils.getAuthRequest(source, socialProperties); |
| | | String authorizeUrl = authRequest.authorize(AuthStateUtils.createState()); |
| | | Map<String, String> map = new HashMap<>(); |
| | | map.put("tenantId", tenantId); |
| | | map.put("domain", domain); |
| | | map.put("state", AuthStateUtils.createState()); |
| | | String authorizeUrl = authRequest.authorize(Base64.encode(JsonUtils.toJsonString(map), StandardCharsets.UTF_8)); |
| | | return R.ok("操作成功", authorizeUrl); |
| | | } |
| | | |
| | |
| | | * @return 结果 |
| | | */ |
| | | @PostMapping("/social/callback") |
| | | public R<LoginVo> socialCallback(@RequestBody SocialLoginBody loginBody) { |
| | | public R<Void> socialCallback(@RequestBody SocialLoginBody loginBody) { |
| | | // 获取第三方登录信息 |
| | | AuthResponse<AuthUser> response = SocialUtils.loginAuth( |
| | | loginBody.getSource(), loginBody.getSocialCode(), |
| | |
| | | return R.fail(response.getMsg()); |
| | | } |
| | | loginService.socialRegister(authUserData); |
| | | |
| | | LoginVo loginVo = new LoginVo(); |
| | | SysTenantVo tenant = tenantService.queryByTenantId(LoginHelper.getTenantId()); |
| | | if (StringUtils.isNotBlank(tenant.getTenantId())) { |
| | | loginVo.setDomain(tenant.getDomain()); |
| | | } |
| | | return R.ok(loginVo); |
| | | return R.ok(); |
| | | } |
| | | |
| | | |
| | |
| | | */ |
| | | @GetMapping("/tenant/list") |
| | | public R<LoginTenantVo> tenantList(HttpServletRequest request) throws Exception { |
| | | // 返回对象 |
| | | LoginTenantVo result = new LoginTenantVo(); |
| | | boolean enable = TenantHelper.isEnable(); |
| | | result.setTenantEnabled(enable); |
| | | // 如果未开启租户这直接返回 |
| | | if (!enable) { |
| | | return R.ok(result); |
| | | } |
| | | |
| | | List<SysTenantVo> tenantList = tenantService.queryList(new SysTenantBo()); |
| | | List<TenantListVo> voList = MapstructUtils.convert(tenantList, TenantListVo.class); |
| | | try { |
| | | // 如果只超管返回所有租户 |
| | | if (LoginHelper.isSuperAdmin()) { |
| | | result.setVoList(voList); |
| | | return R.ok(result); |
| | | } |
| | | } catch (NotLoginException ignored) { |
| | | } |
| | | |
| | | // 获取域名 |
| | | String host; |
| | | String referer = request.getHeader("referer"); |
| | |
| | | // 根据域名进行筛选 |
| | | List<TenantListVo> list = StreamUtils.filter(voList, vo -> |
| | | StringUtils.equals(vo.getDomain(), host)); |
| | | // 返回对象 |
| | | LoginTenantVo vo = new LoginTenantVo(); |
| | | vo.setVoList(CollUtil.isNotEmpty(list) ? list : voList); |
| | | vo.setTenantEnabled(TenantHelper.isEnable()); |
| | | return R.ok(vo); |
| | | result.setVoList(CollUtil.isNotEmpty(list) ? list : voList); |
| | | return R.ok(result); |
| | | } |
| | | |
| | | } |