diff --git a/src/main/java/org/energy/modules/auth/controller/AuthController.java b/src/main/java/org/energy/modules/auth/controller/AuthController.java index fa7b0e8..d7e7f1d 100644 --- a/src/main/java/org/energy/modules/auth/controller/AuthController.java +++ b/src/main/java/org/energy/modules/auth/controller/AuthController.java @@ -90,4 +90,21 @@ public class AuthController { return R.data(Kv.init().set("key", key).set("image", specCaptcha.toBase64())); } + @PostMapping("scada-token") + @ApiOperation(value = "获取认证scada-token", notes = "传入") + public R token2(@ApiParam(value = "租户ID", required = true) @RequestParam(defaultValue = "000000", required = false) String tenantId, + @ApiParam(value = "token") @RequestParam(required = false) String token) { + String grantType = "scada"; + TokenParameter tokenParameter = new TokenParameter(); + tokenParameter.getArgs().set("tenantId", tenantId).set("grantType", grantType).set("token", token); + ITokenGranter granter = TokenGranterBuilder.getGranter(grantType); + UserInfo userInfo = granter.grant(tokenParameter); + + if (userInfo == null || userInfo.getUser() == null) { + return R.fail(TokenUtil.USER_NOT_FOUND); + } + // success + return R.data(TokenUtil.createAuthInfo(userInfo)); + } + } diff --git a/src/main/java/org/energy/modules/auth/granter/ScadaTokenGranter.java b/src/main/java/org/energy/modules/auth/granter/ScadaTokenGranter.java new file mode 100644 index 0000000..1abfe0a --- /dev/null +++ b/src/main/java/org/energy/modules/auth/granter/ScadaTokenGranter.java @@ -0,0 +1,78 @@ +/** + * Copyright (c) 2018-2028, Chill Zhuang 庄骞 (smallchill@163.com). + *

+ * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + *

+ * http://www.apache.org/licenses/LICENSE-2.0 + *

+ * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.energy.modules.auth.granter; + +import cn.hutool.core.bean.BeanUtil; +import cn.hutool.core.codec.Base64; +import cn.hutool.core.date.DateUtil; +import cn.hutool.core.util.StrUtil; +import cn.hutool.crypto.SecureUtil; +import cn.hutool.json.JSONUtil; +import com.dayu.daf.core.launch.constant.TokenConstant; +import com.dayu.daf.core.log.exception.ServiceException; +import com.dayu.daf.core.tool.utils.Func; +import lombok.AllArgsConstructor; +import org.energy.modules.auth.properties.ScadaAuthProperties; +import org.energy.modules.auth.response.ShareAuthResponse; +import org.energy.modules.auth.utils.AesUtil; +import org.energy.modules.auth.utils.TokenUtil; +import org.energy.modules.system.entity.UserInfo; +import org.energy.modules.system.service.IUserService; +import org.springframework.stereotype.Component; + +import javax.annotation.Resource; +import java.util.Date; + +/** + * ScadaTokenGranter + * + * @author Chill + */ +@Component +@AllArgsConstructor +public class ScadaTokenGranter implements ITokenGranter { + + public static final String GRANT_TYPE = "scada"; + + private IUserService userService; + + @Resource + private ScadaAuthProperties properties; + + @Override + public UserInfo grant(TokenParameter tokenParameter) { + String token = tokenParameter.getArgs().getStr("token"); + String tenantId = tokenParameter.getArgs().getStr("tenantId"); + UserInfo userInfo = null; + if (Func.isNoneBlank(token)) { + byte[] tokenByte = Base64.decode(token); + String decrypt = AesUtil.decrypt(tokenByte, properties.getScadaKey(), properties.getScadaIv()); + if (StrUtil.isBlank(decrypt)) { + throw new ServiceException("授权错误"); + } + ShareAuthResponse response = BeanUtil.toBean(JSONUtil.parse(decrypt), ShareAuthResponse.class); + if (DateUtil.compare(new Date(), DateUtil.parseDate(response.getExpires())) > 0) { + throw new ServiceException("token过期,请重新登录。"); + } + String account = response.getUserName(); + userInfo = userService.userInfo(tenantId, account); + } else { + throw new ServiceException("token错误"); + } + return userInfo; + } + +} diff --git a/src/main/java/org/energy/modules/auth/granter/TokenGranterBuilder.java b/src/main/java/org/energy/modules/auth/granter/TokenGranterBuilder.java index 5a08f40..c99f1ed 100644 --- a/src/main/java/org/energy/modules/auth/granter/TokenGranterBuilder.java +++ b/src/main/java/org/energy/modules/auth/granter/TokenGranterBuilder.java @@ -41,6 +41,7 @@ public class TokenGranterBuilder { GRANTER_POOL.put(CaptchaTokenGranter.GRANT_TYPE, SpringUtil.getBean(CaptchaTokenGranter.class)); GRANTER_POOL.put(RefreshTokenGranter.GRANT_TYPE, SpringUtil.getBean(RefreshTokenGranter.class)); GRANTER_POOL.put(SocialTokenGranter.GRANT_TYPE, SpringUtil.getBean(SocialTokenGranter.class)); + GRANTER_POOL.put(ScadaTokenGranter.GRANT_TYPE, SpringUtil.getBean(ScadaTokenGranter.class)); } /** diff --git a/src/main/java/org/energy/modules/auth/properties/ScadaAuthProperties.java b/src/main/java/org/energy/modules/auth/properties/ScadaAuthProperties.java new file mode 100644 index 0000000..21f66ba --- /dev/null +++ b/src/main/java/org/energy/modules/auth/properties/ScadaAuthProperties.java @@ -0,0 +1,25 @@ +package org.energy.modules.auth.properties; + +import lombok.Data; +import lombok.Getter; +import lombok.Setter; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.boot.context.properties.ConfigurationProperties; +import org.springframework.context.annotation.Configuration; +import org.springframework.stereotype.Component; + +/** + * 配置类 + * + * @author dayu + */ +@Component +@Data +public class ScadaAuthProperties { + @Value("${sso.scada.key}") + private String scadaKey; + + @Value("${sso.scada.iv}") + private String scadaIv; + +} diff --git a/src/main/java/org/energy/modules/auth/response/ShareAuthResponse.java b/src/main/java/org/energy/modules/auth/response/ShareAuthResponse.java new file mode 100644 index 0000000..202a86c --- /dev/null +++ b/src/main/java/org/energy/modules/auth/response/ShareAuthResponse.java @@ -0,0 +1,38 @@ +package org.energy.modules.auth.response; + +import lombok.Getter; +import lombok.Setter; +import lombok.ToString; + +/** + * 分享链接鉴权返回值 + * + * @author dayu + * @since 2024/7/2 16:54 + */ +@Getter +@Setter +@ToString +public class ShareAuthResponse { + + /** + * 用户唯一凭证 + */ + private String uid; + + /** + * 用户名称 + */ + private String userName; + + /** + * 角色名称 + */ + private String roleName; + + /** + * 有效期 + */ + private String expires; + +} diff --git a/src/main/java/org/energy/modules/auth/utils/AesUtil.java b/src/main/java/org/energy/modules/auth/utils/AesUtil.java new file mode 100644 index 0000000..a6454f9 --- /dev/null +++ b/src/main/java/org/energy/modules/auth/utils/AesUtil.java @@ -0,0 +1,31 @@ +package org.energy.modules.auth.utils; + +import cn.hutool.crypto.Mode; +import cn.hutool.crypto.Padding; +import cn.hutool.crypto.symmetric.AES; +import lombok.extern.slf4j.Slf4j; + +/** + * Aes 加解密工具类 + * + * @author dayu + **/ +@Slf4j +public class AesUtil { + + /** + * 解密 + */ + public static String decrypt(byte[] content, String key, String iv) { + AES aes = new AES(Mode.CBC, Padding.PKCS5Padding, key.getBytes()); + aes.setIv(iv.getBytes()); + try { + byte[] decryptedBytes = aes.decrypt(content); + return new String(decryptedBytes); + } catch (Exception e) { + log.warn("解密失败", e); + return null; + } + } + +} diff --git a/src/main/java/org/energy/modules/smart/entity/WorkOrder.java b/src/main/java/org/energy/modules/smart/entity/WorkOrder.java index a906147..93e9b31 100644 --- a/src/main/java/org/energy/modules/smart/entity/WorkOrder.java +++ b/src/main/java/org/energy/modules/smart/entity/WorkOrder.java @@ -75,9 +75,8 @@ public class WorkOrder extends BaseEntity { /** * 维护作业类型 */ - @JsonSerialize(nullsUsing = NullSerializer.class) @ApiModelProperty(value = "维护作业类型") - private Integer maintenanceTaskType; + private String maintenanceTaskType; /** * 用户状态 */ @@ -117,9 +116,8 @@ public class WorkOrder extends BaseEntity { /** * 处理结果 */ - @JsonSerialize(nullsUsing = NullSerializer.class) @ApiModelProperty(value = "处理结果") - private Integer handlingResult; + private String handlingResult; /** * 审核状态 */ diff --git a/src/main/java/org/energy/modules/system/service/IUserService.java b/src/main/java/org/energy/modules/system/service/IUserService.java index a839610..3c99c7c 100644 --- a/src/main/java/org/energy/modules/system/service/IUserService.java +++ b/src/main/java/org/energy/modules/system/service/IUserService.java @@ -147,4 +147,6 @@ public interface IUserService extends BaseService { User selectByIdAndDel(Long createUser); User selectByAccountAndDel(String account); + + UserInfo userInfo(String tenantId, String account); } diff --git a/src/main/java/org/energy/modules/system/service/impl/UserServiceImpl.java b/src/main/java/org/energy/modules/system/service/impl/UserServiceImpl.java index d04e328..5e03524 100644 --- a/src/main/java/org/energy/modules/system/service/impl/UserServiceImpl.java +++ b/src/main/java/org/energy/modules/system/service/impl/UserServiceImpl.java @@ -17,10 +17,12 @@ package org.energy.modules.system.service.impl; import com.baomidou.mybatisplus.core.conditions.Wrapper; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.baomidou.mybatisplus.core.metadata.IPage; import com.baomidou.mybatisplus.core.toolkit.Wrappers; import com.dayu.daf.core.log.exception.ServiceException; import com.dayu.daf.core.mp.base.BaseServiceImpl; +import com.dayu.daf.core.tool.constant.DafConstant; import com.dayu.daf.core.tool.utils.*; import lombok.AllArgsConstructor; import org.energy.common.constant.CommonConstant; @@ -216,4 +218,20 @@ public class UserServiceImpl extends BaseServiceImpl implement public User selectByAccountAndDel(String account) { return baseMapper.selectByAccountAndDel(account); } + + @Override + public UserInfo userInfo(String tenantId, String account) { + UserInfo userInfo = new UserInfo(); + QueryWrapper userQueryWrapper = new QueryWrapper<>(); + userQueryWrapper.lambda().eq(User::getTenantId, tenantId); + userQueryWrapper.lambda().eq(User::getAccount, account); + userQueryWrapper.lambda().eq(User::getIsDeleted, DafConstant.DB_NOT_DELETED); + User user = super.getOne(userQueryWrapper); + userInfo.setUser(user); + if (Func.isNotEmpty(user)) { + List roleAlias = baseMapper.getRoleAlias(Func.toLongList(user.getRoleId())); + userInfo.setRoles(roleAlias); + } + return userInfo; + } }