点击查看【bilibili】
登录用户支持多表存储 - 图1

用户与客户

  • TOB 用户,指的是通过 PIG 登录后台完成业务能力的用户(比如淘宝的后台管理员等),此部分用户保存在 sys_user 表。
  • TOC 客户,指的是面向大众的客户(比如在淘宝购买东西的客户),此部分客户独立存在

快速上手

新增 TOC 客户表

  • ① 此表对应的实体都会放在 upms 模块,所以表也要和原有 sys_user 在同一个数据库
  1. CREATE TABLE `toc_custom` (
  2. `id` int(11) NOT NULL AUTO_INCREMENT,
  3. `nickname` varchar(255) COLLATE utf8mb4_general_ci DEFAULT NULL,
  4. `username` varchar(255) COLLATE utf8mb4_general_ci NOT NULL,
  5. `password` varchar(255) COLLATE utf8mb4_general_ci NOT NULL,
  6. PRIMARY KEY (`id`)
  7. ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci COMMENT='客户表';
  • ② pig-upms-api 新增 TocCustom 实体
  1. @Data
  2. public class TocCustom implements Serializable {
  3. private static final long serialVersionUID = 1L;
  4. private Long id;
  5. private String nickname;
  6. private String username;
  7. private String password;
  8. }
  • ③ pig-upms-biz 新增 TocCustomMapper 查询工具
  1. @Mapper
  2. public interface TocCustomMapper extends BaseMapper<TocCustom> {
  3. }
  • ④ pig-upms-biz 新增 custom 查询接口
  1. @Inner
  2. @GetMapping("/custom/{username}")
  3. public R customInfo(@PathVariable String username) {
  4. TocCustom custom = customMapper.selectOne(Wrappers.<TocCustom>lambdaQuery()
  5. .eq(TocCustom::getUsername, username));
  6. return R.ok(custom);
  7. }

登录用户支持多表存储 - 图2

  • ⑤ feign-client 增加调用 custom 接口
  1. @FeignClient(contextId = "remoteUserService", value = ServiceNameConstants.UPMS_SERVICE)
  2. public interface RemoteUserService {
  3. @GetMapping("/user/custom/{username}")
  4. R<TocCustom> custom(@PathVariable("username") String username, @RequestHeader(SecurityConstants.FROM) String from);
  5. }

修改认证中心代码

  • ① 增加 custom 客户端
  1. INSERT INTO `sys_oauth_client_details` (`client_id`,`resource_ids`,`client_secret`,`scope`,`authorized_grant_types`,`web_server_redirect_uri`,`authorities`,`access_token_validity`,`refresh_token_validity`,`additional_information`,`autoapprove`) VALUES ('custom',NULL,'custom','server','password,refresh_token',NULL,NULL,10000,11111111,'','true');
  • ② 修改整个框架最核心的代码 custom 客户端的专用 UserDetailsService
  1. @Slf4j
  2. @RequiredArgsConstructor
  3. public class PigCustomUserDetailsServiceImpl implements PigUserDetailsService {
  4. private final RemoteUserService remoteUserService;
  5. private final CacheManager cacheManager;
  6. /**
  7. * 用户名密码登录
  8. * @param username 用户名
  9. * @return
  10. */
  11. @Override
  12. @SneakyThrows
  13. public UserDetails loadUserByUsername(String username) {
  14. R<TocCustom> result = remoteUserService.custom(username, SecurityConstants.FROM_IN);
  15. // 根据 result 构建security 框架需要的 用户对象
  16. TocCustom custom = result.getData();
  17. if (custom == null) {
  18. throw new UsernameNotFoundException("用户不存在");
  19. }
  20. // 构造security用户
  21. return new PigUser(custom.getId(), null, custom.getUsername(), custom.getPassword(), null, true, true,
  22. true, true, AuthorityUtils.NO_AUTHORITIES);
  23. }
  24. /**
  25. * 是否支持此客户端校验
  26. * @param clientId 目标客户端
  27. * @param grantType
  28. * @return true/false
  29. */
  30. @Override
  31. public boolean support(String clientId, String grantType) {
  32. return "custom".equals(clientId);
  33. }
  34. @Override
  35. public int getOrder() {
  36. return Integer.MIN_VALUE + 1;
  37. }
  38. }
  • ③ 配置SPI 加载 CustomUserDetailsService

image.png

!> 重点说明以上改动代码出现的重要参数

参数 说明
clientId 这里根据前端登录请求写的的 clientId 区分是否是 toc 请求还是 tob 请求。这里选择 test 客户端
AuthorityUtils.NO_AUTHORITIES 这里说明 toc 用户没有角色这一说,当然你可以通过后台创建一个角色 “ROLE_CUSTOM” 赋值给它

调用测试

  1. curl --location --request POST 'http://pig-gateway:9999/auth/oauth2/token?grant_type=password' \
  2. --header 'Authorization: Basic Y3VzdG9tOmN1c3RvbQ==' \
  3. --header 'Content-Type: application/x-www-form-urlencoded' \
  4. --data-urlencode 'username=lengleng' \
  5. --data-urlencode 'password=123456' \
  6. --data-urlencode 'scope=server'

❤ 问题咨询

手势点击蓝字求关注简约风动态引导关注__2022-09-07+23_18_38.gif