郑州烟草研究院统一认证平台对接规范 郑州烟草研究院统一认证平台对接规范
首页
  • 介绍

    • 关于
  • 如何接入

    • 开始
    • 订阅注册
    • 拉取机构
    • 拉取用户
    • 常见问题
  • 单点登录

    • 介绍
    • jssdk接入
    • JavaSdk接入
    • 自行接入
    • 常见问题
  • 单点退出

    • 01退出登录
  • 统一通知
  • 信息发布
  • 统一检索
  • 统一待办
首页
  • 介绍

    • 关于
  • 如何接入

    • 开始
    • 订阅注册
    • 拉取机构
    • 拉取用户
    • 常见问题
  • 单点登录

    • 介绍
    • jssdk接入
    • JavaSdk接入
    • 自行接入
    • 常见问题
  • 单点退出

    • 01退出登录
  • 统一通知
  • 信息发布
  • 统一检索
  • 统一待办
  • 介绍

  • 如何接入

    • 快速开始
    • 订阅注册
      • 拉取机构
      • 拉取用户
      • 常见问题
    目录

    订阅注册

    # 开始

    # 一、新建接口类

    首先完成在PC端配置之后,需要创建自己的接口,接口的地址为你在订阅注册时候填写的地址,这里需要注意,这个接口应当是开放的,接口的鉴权应当由接口内部实现,你框架层面需要放开拦截

    例如 http://127.0.0.1:8080/sinuo/urm/receiveUrmInfo 请求方式是为post 首先需要依赖pom文件 当前jar包在公司私服,暂时未开放,需要的话可以找开发索要,然后上传到自己私服即可,后续也考虑放在公网服务中

          <dependency>
                <groupId>com.scsoft</groupId>
                <artifactId>auth-sso-spring-boot-starter</artifactId>
                <version>2.0.3</version>
          </dependency>
    
    
    1
    2
    3
    4
    5
    6

    如果不依赖这个,单点也需要自己实现,上面这个pom是单点登录实现的基础包,里面包含所有的两个UrmUserBean ,UrmDepartBean ,下面我也会贴出来改文件,接入方可自行创建

    接入jar包之后,需要提供接口,接口里面需要引入appid和appSecret,这两个是在注册时候颁发的,如果是springboot项目可以通过配置文件中配置 然后通过@value进行引入,也可以自行配置 接入之后可以调用AppSignUtil.signAppSecret(appId,appSecret,businessKey,request)进行校验 下面是我提供的一个简单示例,并不适用与接入方的项目,需要根据自己的业务改造,具体以接入时调试为主,

    关于加密传输 使用的是SM4基于hutool的工具类实现的加密解密,可以参考hutool的加解密方法

    // 除了hutool工具包  还需要额外引入,具体使用请参考hutool
    <dependency>
    <groupId>org.bouncycastle</groupId>
    <artifactId>bcprov-jdk15on</artifactId>
    </dependency>
    
    1
    2
    3
    4
    5

    示例接口

    
    @RestController
    @RequestMapping("/sinuo/urm")
    public class SinuoUrmController {
    
        // 运维支撑部门id
        private static String departId = "";
        @Value("${sinuo.appId}")
        public String appId;
        @Value("${sinuo.appSecret}")
        public String appSecret;
        @Resource
        private IDepartService departService;
        @Resource
        private IUserService userService;
        @Resource
        private IRoleService roleService;
        
        @RequestMapping("receiveUrmInfo")
        public JsonResult receiveUrmInfo(HttpServletRequest request, String urmType, String businessKey, String data, String handleType,String isSecret) {
            System.out.println("*******接收统一资源" + urmType + "信息********");
            System.out.println(businessKey);
            System.out.println(handleType);
            System.out.println(data);
            boolean flag= AppSignUtil.signAppSecret(appId,appSecret,businessKey,request);
            if (!flag){
              return JsonResult.error("签名错误");
            }
            
          if (StringUtils.isNotBlank(data)) {
             if (isSecret.equals("1")){
                String combined = appId + appSecret;
                byte[] key = DigestUtil.md5(combined.getBytes());
                SM4 sm4 = SmUtil.sm4(key);
                byte[] decryptData = sm4.decrypt(Base64.decode(data));
                String decryptStr = new String(decryptData);
                //System.out.println("解密结果: " + decryptStr);
                data=decryptStr;
              }
            if ("insert".equals(handleType) || "update".equals(handleType)) {
              if ("depart".equals(urmType)) {
                UrmDepartDto dto = JSONObject.parseObject(data, UrmDepartDto.class);
                // 获取上级机构
                LambdaQueryWrapper<Depart> ew = new LambdaQueryWrapper<>();
    //                    ew.eq(Depart::getOtherId, dto.getPOrg());
                ew.eq(Depart::getId, dto.getPOrg());
                ew.last("limit 1");
                Depart pDepart = departService.getOne(ew);
                Depart depart = new Depart();
                depart.setDepartName(dto.getDepartName());
                depart.setDescription((pDepart == null ? "" : (pDepart.getDescription()) + "-") + dto.getDepartName());
                depart.setOrgType("0");
                depart.setDepartOrder(String.valueOf(dto.getDepartOrder()));
                depart.setDepartLevel(dto.getDepartLevel());
                depart.setId(dto.getCOrg());
                depart.setAddress(dto.getAddress());
    //                    depart.setOtherPId(dto.getPOrg());
                depart.setParentId(pDepart == null ? "-1": dto.getPOrg());
                depart.setOrgCode(dto.getOrgCode());
                depart.setOtherId(dto.getCOrg());
    
                // 简单粗暴,有则更新,无则添加
                Depart departQuery = departService.getById(dto.getCOrg());
                if (departQuery == null) {
                  departService.save(depart);
                } else {
                  LambdaUpdateWrapper<Depart> updateEw = new LambdaUpdateWrapper<>();
                  updateEw.eq(Depart::getId, dto.getCOrg());
                  departService.update(depart, updateEw);
                }
              } else if ("user".equals(urmType)) {
    //                    UrmUserDto dto = JSONObject.parseObject(json.get("data").toString(), UrmUserDto.class);
                UrmUserDto dto = JSONObject.parseObject(data, UrmUserDto.class);
                // 获取所属机构
                // TODO
                Depart depart=departService.getOne(new LambdaQueryWrapper<Depart>()
                        .eq(Depart::getId, StringUtils.isNotBlank(departId) ? departId : dto.getCOrg()));
                if (depart != null) {
                  User user = new User();
                  user.setUserName(dto.getUserName());
                  user.setRealName(dto.getRealName());
                  user.setUserNum(dto.getUserNum());
                  user.setSex(dto.getSex());
                  user.setStatus(0);
                  user.setAddress(dto.getAddress());
                  user.setUserType(0);
                  user.setUserOrder(dto.getUserOrder());
                  user.setRoles(getDefaultRoles());
                  user.setAddress(dto.getAddress());
                  user.setEmail(dto.getEmail());
                  user.setMobilePhone(dto.getMobilePhone());
                  //user.setExtData(dto.getExtData());
                  user.setOtherId(dto.getUniqueNo());
    
                  // 简单粗暴,有则更新,无则添加
                  User userQuery = userService.getByUsername(user.getUserName());
                  if (userQuery == null) {
    //                            user.setId(dto.getId());
                    user.setId(IdWorker.getIdStr());
                    System.out.println("密码:" + Base64.decodeStr(dto.getPassword()));
                    user.setPassword(Base64.decodeStr(dto.getPassword()));
                    userService.add(user, depart.getId());
                  } else {
                    user.setId(userQuery.getId());
                    userService.update(user, depart.getId());
                  }
                }
              }
            } else if ("delete".equals(handleType)) {
              if ("depart".equals(urmType)) {
                // 删除机构
                // 删除机构下用户
              } else if ("user".equals(urmType)) {
                // 删除用户
                UrmUserDto dto = JSONObject.parseObject(data, UrmUserDto.class);
                userService.deleteByOtherId(dto.getUniqueNo());
              }
            }
          }
          return JsonResult.ok();
        }
    
        private List<Role> getDefaultRoles() {
            // 默认角色:普通用户,code=102
            LambdaQueryWrapper<Role> ew = new LambdaQueryWrapper<>();
            ew.eq(Role::getCode, "102");
            return roleService.list(ew);
        }
    
    
    }
    
    
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132

    d 注意:此处可设置用户要同步到的机构id,是为了方便测试推送用户,后续接入机构后,以推送的机构id为准

    ::: 切记接口一定为开放的,要不然无法完成调用 ::: warning

    UrmDepartBean 代码示例

    @Data
    public class UrmDepartBean {
    
        private String id;
    
        private String poolId;
    
        private String sourceDepartId;
    
        private String departName;
    
        private String cOrg;
    
        private String pOrg;
    
        private String description;
    
        private String pOrgs;
    
        private String orgCode;
    
        private String orgType;
    
        private String administrativeDivision;
    
        private String address;
    
        private Integer departOrder;
    
        private String departLevel;
    }
    
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31

    UrmUserBean 代码示例

    @Data
    public class UrmUserBean {
    
        private String id;
    
        private String poolId;
    
        private String userName;
        private String password;
    
        private String realName;
    
        private String sex;
    
        private String birthDate;
    
        private String mobilePhone;
    
        private String address;
    
        private String email;
    
        private String userType;
    
        private String status;
    
        private String sectionAddr;
    
        private String workTel;
    
        private String workPost;
    
        private String userOrder;
    
        private String idCard;
    
        private String secretLevel;
    
        private String shortNo;
    
        private String cOrg;
    
        private String extData;
    }
    
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    快速开始
    拉取机构

    ← 快速开始 拉取机构→

    • 跟随系统
    • 浅色模式
    • 深色模式
    • 阅读模式