From 56624074de48bbc50def58f9cdbc726f1c4fddf9 Mon Sep 17 00:00:00 2001 From: lbw Date: Fri, 3 Dec 2021 18:05:44 +0800 Subject: [PATCH] =?UTF-8?q?:sparkles:=20Introducing=20new=20features.=20cl?= =?UTF-8?q?ose=20#3394=20=E3=80=90=E7=94=A8=E6=88=B7=E4=BF=A1=E6=81=AF?= =?UTF-8?q?=E3=80=91=E6=89=A9=E5=B1=95=E7=94=A8=E6=88=B7=E5=9F=BA=E6=9C=AC?= =?UTF-8?q?=E4=BF=A1=E6=81=AF=E5=A2=9E=E5=8A=A0=E9=83=A8=E5=88=86=E6=89=A9?= =?UTF-8?q?=E5=B1=95=E5=AD=97=E6=AE=B5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- db/2pigxx.sql | 8 ++++---- .../PigxUserAuthenticationConverter.java | 6 ++---- .../common/security/service/PigxUser.java | 12 ++++++------ .../service/PigxUserDetailsServiceImpl.java | 4 ++-- .../service/impl/SysUserServiceImpl.java | 2 +- .../src/main/resources/file/user.xlsx | Bin 8868 -> 8891 bytes 6 files changed, 15 insertions(+), 17 deletions(-) diff --git a/db/2pigxx.sql b/db/2pigxx.sql index b1a8b70b8..53bbd9e97 100644 --- a/db/2pigxx.sql +++ b/db/2pigxx.sql @@ -753,6 +753,9 @@ CREATE TABLE `sys_user` ( `salt` varchar(255) DEFAULT NULL, `phone` varchar(20) DEFAULT NULL, `avatar` varchar(255) DEFAULT NULL, + `nickname` varchar(64) DEFAULT NULL COMMENT '拓展字段:昵称', + `name` varchar(64) DEFAULT NULL COMMENT '拓展字段:姓名', + `email` varchar(128) DEFAULT NULL COMMENT '拓展字段:邮箱', `dept_id` int(11) DEFAULT NULL COMMENT '部门ID', `create_time` datetime NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间', `update_time` datetime NULL DEFAULT NULL ON UPDATE CURRENT_TIMESTAMP COMMENT '修改时间', @@ -764,9 +767,6 @@ CREATE TABLE `sys_user` ( `gitee_login` varchar(100) DEFAULT NULL COMMENT '码云 标识', `osc_id` varchar(100) DEFAULT NULL COMMENT '开源中国 标识', `tenant_id` int(11) NOT NULL DEFAULT '0' COMMENT '所属租户', - `nickname` varchar(255) DEFAULT NULL COMMENT '拓展字段:昵称', - `name` varchar(64) DEFAULT NULL COMMENT '拓展字段:姓名', - `email` varchar(255) DEFAULT NULL COMMENT '拓展字段:邮箱', PRIMARY KEY (`user_id`) USING BTREE, KEY `user_wx_openid` (`wx_openid`) USING BTREE, KEY `user_qq_openid` (`qq_openid`) USING BTREE, @@ -777,7 +777,7 @@ CREATE TABLE `sys_user` ( -- Records of sys_user -- ---------------------------- BEGIN; -INSERT INTO `sys_user` VALUES (1, 'admin', '$2a$10$IVzj1Wd.ZQdOIWdb1htQjexU94uoNeuk1crlQ9ExVupPi0Iy1uv.C', '', '17034642888', '/admin/sys-file/lengleng/c5a85e0770cd4fe78bc14b63b3bd05ae.jpg', 1, '2018-04-20 07:15:18', '2019-11-02 22:12:11', '0', '0', 'o_0FT0uyg_H1vVy2H0JpSwlVGhWQ', 'oBxPy5E-v82xWGsfzZVzkD3wEX64', NULL, 'log4j', '2303656', 1,NULL,NULL,NULL); +INSERT INTO `sys_user` VALUES (1, 'admin', '$2a$10$IVzj1Wd.ZQdOIWdb1htQjexU94uoNeuk1crlQ9ExVupPi0Iy1uv.C', '', '17034642888', '/admin/sys-file/lengleng/c5a85e0770cd4fe78bc14b63b3bd05ae.jpg',NULL,NULL,NULL, 1, '2018-04-20 07:15:18', '2019-11-02 22:12:11', '0', '0', 'o_0FT0uyg_H1vVy2H0JpSwlVGhWQ', 'oBxPy5E-v82xWGsfzZVzkD3wEX64', NULL, 'log4j', '2303656', 1); COMMIT; -- ---------------------------- diff --git a/pigx-common/pigx-common-security/src/main/java/com/pig4cloud/pigx/common/security/component/PigxUserAuthenticationConverter.java b/pigx-common/pigx-common-security/src/main/java/com/pig4cloud/pigx/common/security/component/PigxUserAuthenticationConverter.java index 4a7a9e9e7..49babbb70 100644 --- a/pigx-common/pigx-common-security/src/main/java/com/pig4cloud/pigx/common/security/component/PigxUserAuthenticationConverter.java +++ b/pigx-common/pigx-common-security/src/main/java/com/pig4cloud/pigx/common/security/component/PigxUserAuthenticationConverter.java @@ -62,7 +62,6 @@ public class PigxUserAuthenticationConverter implements UserAuthenticationConver /** * Extract information about the user to be used in an access token (i.e. for resource * servers). - * * @param authentication an authentication representing a user * @return a map of key values representing the unique information about the user */ @@ -79,7 +78,6 @@ public class PigxUserAuthenticationConverter implements UserAuthenticationConver /** * Inverse of {@link #convertUserAuthentication(Authentication)}. Extracts an * Authentication from a map. - * * @param responseMap a map of user information * @return an Authentication representing the user or null if there is none */ @@ -98,7 +96,7 @@ public class PigxUserAuthenticationConverter implements UserAuthenticationConver Integer tenantId = MapUtil.getInt(map, SecurityConstants.DETAILS_TENANT_ID); String phone = MapUtil.getStr(map, SecurityConstants.DETAILS_PHONE); String avatar = MapUtil.getStr(map, SecurityConstants.DETAILS_AVATAR); - PigxUser user = new PigxUser(nickname, name, email, id, deptId, phone, avatar, tenantId, username, N_A, + PigxUser user = new PigxUser(id, username, deptId, phone, avatar, nickname, name, email, tenantId, N_A, true, true, true, true, authorities); return new UsernamePasswordAuthenticationToken(user, N_A, authorities); } @@ -124,7 +122,7 @@ public class PigxUserAuthenticationConverter implements UserAuthenticationConver log.warn("请求头中的租户ID({})和用户的租户ID({})不一致", headerValue, userValue); // TODO: 不要提示租户ID不对,可能被穷举 throw new PigxAuth2Exception(PigxSecurityMessageSourceUtil.getAccessor().getMessage( - "AbstractUserDetailsAuthenticationProvider.badTenantId", new Object[]{headerValue}, + "AbstractUserDetailsAuthenticationProvider.badTenantId", new Object[] { headerValue }, "Bad tenant ID")); } } diff --git a/pigx-common/pigx-common-security/src/main/java/com/pig4cloud/pigx/common/security/service/PigxUser.java b/pigx-common/pigx-common-security/src/main/java/com/pig4cloud/pigx/common/security/service/PigxUser.java index be852ad08..a2f268c79 100644 --- a/pigx-common/pigx-common-security/src/main/java/com/pig4cloud/pigx/common/security/service/PigxUser.java +++ b/pigx-common/pigx-common-security/src/main/java/com/pig4cloud/pigx/common/security/service/PigxUser.java @@ -106,12 +106,12 @@ public class PigxUser extends User { * a parameter or as an element in the GrantedAuthority collection */ @JsonCreator - public PigxUser(@JsonProperty("nickname") String nickname, @JsonProperty("name") String name, - @JsonProperty("email") String email, @JsonProperty("id") Integer id, @JsonProperty("deptId") Integer deptId, - @JsonProperty("phone") String phone, @JsonProperty("avatar") String avatar, - @JsonProperty("tenantId") Integer tenantId, @JsonProperty("username") String username, - @JsonProperty("password") String password, @JsonProperty("enabled") boolean enabled, - @JsonProperty("accountNonExpired") boolean accountNonExpired, + public PigxUser(@JsonProperty("id") Integer id, @JsonProperty("username") String username, + @JsonProperty("deptId") Integer deptId, @JsonProperty("phone") String phone, + @JsonProperty("avatar") String avatar, @JsonProperty("nickname") String nickname, + @JsonProperty("name") String name, @JsonProperty("email") String email, + @JsonProperty("tenantId") Integer tenantId, @JsonProperty("password") String password, + @JsonProperty("enabled") boolean enabled, @JsonProperty("accountNonExpired") boolean accountNonExpired, @JsonProperty("credentialsNonExpired") boolean credentialsNonExpired, @JsonProperty("accountNonLocked") boolean accountNonLocked, @JsonProperty("authorities") Collection authorities) { diff --git a/pigx-common/pigx-common-security/src/main/java/com/pig4cloud/pigx/common/security/service/PigxUserDetailsServiceImpl.java b/pigx-common/pigx-common-security/src/main/java/com/pig4cloud/pigx/common/security/service/PigxUserDetailsServiceImpl.java index fedcb2b79..72ecd56af 100644 --- a/pigx-common/pigx-common-security/src/main/java/com/pig4cloud/pigx/common/security/service/PigxUserDetailsServiceImpl.java +++ b/pigx-common/pigx-common-security/src/main/java/com/pig4cloud/pigx/common/security/service/PigxUserDetailsServiceImpl.java @@ -113,8 +113,8 @@ public class PigxUserDetailsServiceImpl implements PigxUserDetailsService { boolean enabled = StrUtil.equals(user.getLockFlag(), CommonConstants.STATUS_NORMAL); // 构造security用户 - return new PigxUser(user.getNickname(), user.getName(), user.getEmail(), user.getUserId(), user.getDeptId(), - user.getPhone(), user.getAvatar(), user.getTenantId(), user.getUsername(), + return new PigxUser(user.getUserId(), user.getUsername(), user.getDeptId(), user.getPhone(), user.getAvatar(), + user.getNickname(), user.getName(), user.getEmail(), user.getTenantId(), SecurityConstants.BCRYPT + user.getPassword(), enabled, true, true, !CommonConstants.STATUS_LOCK.equals(user.getLockFlag()), authorities); } diff --git a/pigx-upms/pigx-upms-biz/src/main/java/com/pig4cloud/pigx/admin/service/impl/SysUserServiceImpl.java b/pigx-upms/pigx-upms-biz/src/main/java/com/pig4cloud/pigx/admin/service/impl/SysUserServiceImpl.java index ba4403726..4373cf6c2 100644 --- a/pigx-upms/pigx-upms-biz/src/main/java/com/pig4cloud/pigx/admin/service/impl/SysUserServiceImpl.java +++ b/pigx-upms/pigx-upms-biz/src/main/java/com/pig4cloud/pigx/admin/service/impl/SysUserServiceImpl.java @@ -300,7 +300,7 @@ public class SysUserServiceImpl extends ServiceImpl impl if (CollUtil.isNotEmpty(errorMessageList)) { return R.failed(errorMessageList); } - return R.ok(); + return R.ok(null, "用户导入成功,默认密码为手机号"); } /** diff --git a/pigx-upms/pigx-upms-biz/src/main/resources/file/user.xlsx b/pigx-upms/pigx-upms-biz/src/main/resources/file/user.xlsx index 40cf429c863accb112fea3ba594a9cdff8734744..764935442a6daa709fdffe34237a595133995033 100644 GIT binary patch delta 4920 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 Y$)E8be@h^^HV7{+RfLtM;KE<{U%iqY%K!iX delta 4880 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 b%0D4@>z`}Cf}s9_P@_tjNubg6f6V^@icjnA