From 0b7e3ed96d3fab65bb9249bcd62877c1a8027ad8 Mon Sep 17 00:00:00 2001 From: liuyiliang Date: Sun, 21 Jul 2024 08:48:03 +0800 Subject: [PATCH 1/3] sso --- .../auth/controller/AuthController.java | 17 ++++ .../auth/granter/ScadaTokenGranter.java | 78 +++++++++++++++++++ .../auth/granter/TokenGranterBuilder.java | 1 + .../auth/properties/ScadaAuthProperties.java | 25 ++++++ .../auth/response/ShareAuthResponse.java | 38 +++++++++ .../energy/modules/auth/utils/AesUtil.java | 31 ++++++++ .../modules/smart/entity/WorkOrder.java | 6 +- .../modules/system/service/IUserService.java | 2 + .../system/service/impl/UserServiceImpl.java | 18 +++++ 9 files changed, 212 insertions(+), 4 deletions(-) create mode 100644 src/main/java/org/energy/modules/auth/granter/ScadaTokenGranter.java create mode 100644 src/main/java/org/energy/modules/auth/properties/ScadaAuthProperties.java create mode 100644 src/main/java/org/energy/modules/auth/response/ShareAuthResponse.java create mode 100644 src/main/java/org/energy/modules/auth/utils/AesUtil.java 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; + } } From 28d09e63b65bf17af088fc29b5047348550a3ce1 Mon Sep 17 00:00:00 2001 From: liuyiliang Date: Mon, 22 Jul 2024 12:48:47 +0800 Subject: [PATCH 2/3] sso --- src/main/java/org/energy/core/secure/AuthInfo.java | 4 ++++ .../energy/modules/auth/controller/AuthController.java | 2 ++ .../java/org/energy/modules/auth/utils/TokenUtil.java | 1 + .../java/org/energy/modules/system/entity/UserInfo.java | 7 +++++++ .../modules/system/service/impl/UserServiceImpl.java | 8 ++++++++ 5 files changed, 22 insertions(+) diff --git a/src/main/java/org/energy/core/secure/AuthInfo.java b/src/main/java/org/energy/core/secure/AuthInfo.java index dfac768..102d624 100644 --- a/src/main/java/org/energy/core/secure/AuthInfo.java +++ b/src/main/java/org/energy/core/secure/AuthInfo.java @@ -20,6 +20,9 @@ import com.fasterxml.jackson.databind.ser.std.ToStringSerializer; import io.swagger.annotations.ApiModel; import io.swagger.annotations.ApiModelProperty; import lombok.Data; +import org.energy.modules.system.vo.MenuVO; + +import java.util.List; /** * AuthInfo @@ -54,4 +57,5 @@ public class AuthInfo { private long expiresIn; @ApiModelProperty(value = "许可证") private String license = "powered by daf"; + private List roleMenus; } 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 d7e7f1d..48bfb11 100644 --- a/src/main/java/org/energy/modules/auth/controller/AuthController.java +++ b/src/main/java/org/energy/modules/auth/controller/AuthController.java @@ -34,6 +34,7 @@ import org.energy.modules.auth.granter.TokenParameter; import org.energy.modules.auth.utils.TokenUtil; import org.springframework.web.bind.annotation.*; +import java.util.List; import java.util.UUID; import java.util.concurrent.TimeUnit; @@ -50,6 +51,7 @@ public class AuthController { private RedisUtil redisUtil; + @PostMapping("token") @ApiOperation(value = "获取认证token", notes = "传入租户ID:tenantId,账号:account,密码:password") public R token(@ApiParam(value = "授权类型", required = true) @RequestParam(defaultValue = "password", required = false) String grantType, diff --git a/src/main/java/org/energy/modules/auth/utils/TokenUtil.java b/src/main/java/org/energy/modules/auth/utils/TokenUtil.java index d1d34b8..3e83c30 100644 --- a/src/main/java/org/energy/modules/auth/utils/TokenUtil.java +++ b/src/main/java/org/energy/modules/auth/utils/TokenUtil.java @@ -79,6 +79,7 @@ public class TokenUtil { authInfo.setRefreshToken(createRefreshToken(userInfo).getToken()); authInfo.setTokenType(TokenConstant.BEARER); authInfo.setLicense(TokenConstant.LICENSE_NAME); + authInfo.setRoleMenus(userInfo.getRoleMenus()); return authInfo; } diff --git a/src/main/java/org/energy/modules/system/entity/UserInfo.java b/src/main/java/org/energy/modules/system/entity/UserInfo.java index 2439d57..cfd79a5 100644 --- a/src/main/java/org/energy/modules/system/entity/UserInfo.java +++ b/src/main/java/org/energy/modules/system/entity/UserInfo.java @@ -18,6 +18,7 @@ package org.energy.modules.system.entity; import io.swagger.annotations.ApiModel; import io.swagger.annotations.ApiModelProperty; import lombok.Data; +import org.energy.modules.system.vo.MenuVO; import java.io.Serializable; import java.util.List; @@ -57,4 +58,10 @@ public class UserInfo implements Serializable { @ApiModelProperty(value = "第三方授权id") private String oauthId; + /** + * 角色菜单 + */ + @ApiModelProperty(value = "角色菜单") + private List roleMenus; + } 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 5e03524..28c17bc 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 @@ -35,6 +35,9 @@ import org.energy.modules.system.mapper.UserMapper; import org.energy.modules.system.service.*; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; +import org.energy.modules.system.service.IMenuService; +import org.energy.modules.system.vo.MenuVO; +import com.dayu.daf.core.secure.DafUser; import java.util.Collections; import java.util.List; @@ -56,6 +59,7 @@ public class UserServiceImpl extends BaseServiceImpl implement private IRoleService roleService; private IUserOauthService userOauthService; private ITenantService tenantService; + private IMenuService menuService; @Override public boolean submit(User user) { @@ -95,6 +99,8 @@ public class UserServiceImpl extends BaseServiceImpl implement List roleAlias = baseMapper.getRoleAlias(Func.toLongList(user.getRoleId())); userInfo.setRoles(roleAlias); } + List list = menuService.routes(userInfo.getUser().getRoleId()); + userInfo.setRoleMenus(list); return userInfo; } @@ -232,6 +238,8 @@ public class UserServiceImpl extends BaseServiceImpl implement List roleAlias = baseMapper.getRoleAlias(Func.toLongList(user.getRoleId())); userInfo.setRoles(roleAlias); } + List list = menuService.routes(userInfo.getUser().getRoleId()); + userInfo.setRoleMenus(list); return userInfo; } } From 0cca737a50379cb07773aa7d0e3b087bbe0f88d2 Mon Sep 17 00:00:00 2001 From: liuyiliang Date: Mon, 22 Jul 2024 13:37:45 +0800 Subject: [PATCH 3/3] =?UTF-8?q?=E9=85=8D=E7=BD=AE?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../modules/smart/mapper/WorkOrderMapper.xml | 10 +++++----- src/main/resources/application-dev.yml | 15 +++++++++++++++ 2 files changed, 20 insertions(+), 5 deletions(-) diff --git a/src/main/java/org/energy/modules/smart/mapper/WorkOrderMapper.xml b/src/main/java/org/energy/modules/smart/mapper/WorkOrderMapper.xml index ca5bdf9..7342261 100644 --- a/src/main/java/org/energy/modules/smart/mapper/WorkOrderMapper.xml +++ b/src/main/java/org/energy/modules/smart/mapper/WorkOrderMapper.xml @@ -55,10 +55,10 @@ and a.work_order_type = #{vo.workOrderType} - and a.work_order_no = #{vo.workOrderNo} + and a.work_order_no LIKE CONCAT('%', #{vo.workOrderNo}, '%') - and a.description = #{vo.description} + and a.description LIKE CONCAT('%', #{vo.description}, '%') and a.maintenance_task_type = #{vo.maintenanceTaskType} @@ -67,7 +67,7 @@ and a.user_status = #{vo.userStatus} - and a.responsibility_team = #{vo.responsibilityTeam} + and a.responsibility_team LIKE CONCAT('%', #{vo.responsibilityTeam}, '%') and b.station = ${vo.station} @@ -109,7 +109,7 @@ and a.work_order_no LIKE CONCAT('%', #{vo.workOrderNo}, '%') - and a.description = LIKE CONCAT('%', #{vo.description}, '%') + and a.description LIKE CONCAT('%', #{vo.description}, '%') and a.maintenance_task_type = #{vo.maintenanceTaskType} @@ -118,7 +118,7 @@ and a.user_status = #{vo.userStatus} - and a.responsibility_team = LIKE CONCAT('%', #{vo.responsibilityTeam}, '%') + and a.responsibility_team LIKE CONCAT('%', #{vo.responsibilityTeam}, '%') and b.station = ${vo.station} diff --git a/src/main/resources/application-dev.yml b/src/main/resources/application-dev.yml index b043da4..282a0c1 100644 --- a/src/main/resources/application-dev.yml +++ b/src/main/resources/application-dev.yml @@ -12,10 +12,15 @@ spring: # nodes: 127.0.0.1:7001,127.0.0.1:7002,127.0.0.1:7003 # commandTimeout: 5000 datasource: +# url: jdbc:postgresql://4s27589o64.vicp.fun:32355/om?useSSL=false&useUnicode=true&characterEncoding=utf-8&zeroDateTimeBehavior=convertToNull&transformedBitIsBoolean=true&serverTimezone=GMT%2B8 url: jdbc:postgresql://192.168.10.102:5432/om?useSSL=false&useUnicode=true&characterEncoding=utf-8&zeroDateTimeBehavior=convertToNull&transformedBitIsBoolean=true&serverTimezone=GMT%2B8 username: admin password: 123456 driver-class-name: org.postgresql.Driver +# url: jdbc:mysql://localhost:3306/sys?useSSL=false&useUnicode=true&characterEncoding=utf-8&zeroDateTimeBehavior=convertToNull&transformedBitIsBoolean=true&serverTimezone=GMT%2B8 +# username: root +# password: 123456 +# driver-class-name: com.mysql.cj.jdbc.Driver #第三方登陆 social: @@ -30,3 +35,13 @@ daf: remote-path: /usr/share/nginx/html remote-path-iis: D://iis/html log-mode: true + +#存放路径 +file: + upload_path: c:\\data\\actual\\ #文件上传目录(不配置的话为java.io.tmpdir目录) + +#sso配置 +sso: + scada: + key: )O[WH]6,YF}+efcaj{+oESb9d8>Z'e9M + iv: L+\~f4,Wh)b$=pkf