Ver código fonte

Merge branch 'wip/customer/add-mothod' into 'develop'

添加根据 id 集合查询用户及查询具有某个角色的用户



See merge request !1

linwenhua 3 anos atrás
pai
commit
558c77a22a

+ 48 - 4
smsb-customer-manager-app/src/main/java/com/inspur/customer/service/keycloak/KeycloakServiceImpl.java

@@ -1,6 +1,7 @@
 package com.inspur.customer.service.keycloak;
 
 import com.inspur.customer.service.client.keycloak.KeycloakService;
+import com.inspur.customer.service.dto.KeycloakUserCO;
 import lombok.extern.slf4j.Slf4j;
 import org.apache.dubbo.config.annotation.DubboService;
 import org.keycloak.admin.client.Keycloak;
@@ -11,10 +12,7 @@ import org.springframework.beans.factory.annotation.Value;
 import org.springframework.cache.annotation.Cacheable;
 
 import javax.annotation.Resource;
-import java.util.Collections;
-import java.util.HashMap;
-import java.util.List;
-import java.util.Map;
+import java.util.*;
 import java.util.concurrent.atomic.AtomicReference;
 
 @Slf4j
@@ -40,6 +38,52 @@ public class KeycloakServiceImpl implements KeycloakService {
         return userMap;
     }
 
+    /**
+     * get users in role (xuzhou environment)
+     * @param role role
+     * @return users
+     */
+    @Override
+    public List<KeycloakUserCO> getUsersInRole(String role) {
+        List<KeycloakUserCO> keycloakUserCos = new ArrayList<>();
+        keycloak.realm(realm).roles().get(role).getRoleUserMembers().forEach(user -> {
+            log.info("name: {}", user.getUsername());
+            KeycloakUserCO keycloakUserCo = new KeycloakUserCO();
+            keycloakUserCo.setId(user.getId());
+            keycloakUserCo.setEmail(user.getEmail());
+            keycloakUserCo.setPhone(user.getAttributes().get("phone"));
+            keycloakUserCo.setWechat(user.getAttributes().get("wechat"));
+            keycloakUserCo.setWechatApplet(user.getAttributes().get("wechat-applet-openid"));
+            keycloakUserCos.add(keycloakUserCo);
+        });
+        return keycloakUserCos;
+    }
+
+    /**
+     * get users by ids
+     * according to device's related users is no too much, temporary use that way to get users
+     * @deprecated
+     * @param userIds ids
+     * @return users
+     */
+    @Override
+    public List<KeycloakUserCO> getUsersByIds(List<String> userIds) {
+        List<KeycloakUserCO> keycloakUserCos = new ArrayList<>(userIds.size());
+        userIds.forEach(id -> {
+            UserRepresentation userRepresentation = keycloak.realm(realm).users().get(id).toRepresentation();
+            if (userRepresentation != null) {
+                KeycloakUserCO keycloakUserCo = new KeycloakUserCO();
+                keycloakUserCo.setId(userRepresentation.getId());
+                keycloakUserCo.setEmail(userRepresentation.getEmail());
+                keycloakUserCo.setPhone(userRepresentation.getAttributes().get("phone"));
+                keycloakUserCo.setWechat(userRepresentation.getAttributes().get("wechat"));
+                keycloakUserCo.setWechatApplet(userRepresentation.getAttributes().get("wechat-applet-openid"));
+                keycloakUserCos.add(keycloakUserCo);
+            }
+        });
+        return keycloakUserCos;
+    }
+
     @Override
     public Boolean checkUserRole(String userId, String role) {
         AtomicReference<Boolean> result = new AtomicReference<>(false);

+ 8 - 0
smsb-customer-manager-client/src/main/java/com/inspur/customer/service/client/keycloak/KeycloakService.java

@@ -1,4 +1,7 @@
 package com.inspur.customer.service.client.keycloak;
+import com.inspur.customer.service.dto.KeycloakUserCO;
+
+import java.util.List;
 import java.util.Map;
 
 /**
@@ -13,6 +16,11 @@ public interface KeycloakService {
      */
     Map<String, String> getUserMap();
 
+
+    List<KeycloakUserCO> getUsersInRole(String role);
+
+    List<KeycloakUserCO> getUsersByIds(List<String> userIds);
+
     /**
      * 检查用户是否具备某角色权限
      *

+ 52 - 0
smsb-customer-manager-client/src/main/java/com/inspur/customer/service/dto/KeycloakUserCO.java

@@ -0,0 +1,52 @@
+package com.inspur.customer.service.dto;
+
+import lombok.Data;
+import org.springframework.lang.Nullable;
+
+import java.io.Serializable;
+import java.util.List;
+
+/**
+ * keycloak user
+ * @author linwenhua
+ * @date 2022-06-14 16:54
+ **/
+@Data
+public class KeycloakUserCO implements Serializable {
+
+    private static final long serialVersionUID = 6869360605249346844L;
+
+    private String id;
+
+    private String phone;
+
+    private String email;
+
+    private String wechat;
+
+    private String wechatAppletOpenId;
+    
+    public void setPhone(@Nullable List<String> phones) {
+        if (phones != null && !phones.isEmpty()) {
+            phone = phones.get(0);
+        }
+    }
+
+    public void setWechat(@Nullable List<String> wechats) {
+        if (wechats != null && !wechats.isEmpty()) {
+            String temp = wechats.get(0);
+            if (!temp.contains("{\"")) {
+                wechat = temp;
+            }
+        }
+    }
+
+    public void setWechatApplet(@Nullable List<String> wechatApplets) {
+        if (wechatApplets != null && !wechatApplets.isEmpty()) {
+            String temp = wechatApplets.get(0);
+            if (!temp.contains("{\"")) {
+                wechat = temp;
+            }
+        }
+    }
+}

+ 72 - 0
smsb-customer-manager-start/pom.xml

@@ -0,0 +1,72 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project xmlns="http://maven.apache.org/POM/4.0.0"
+         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+    <parent>
+        <artifactId>smsb-customer-manager</artifactId>
+        <groupId>com.inspur</groupId>
+        <version>0.0.1-SNAPSHOT</version>
+    </parent>
+    <modelVersion>4.0.0</modelVersion>
+
+    <artifactId>smsb-customer-manager-start</artifactId>
+
+    <dependencies>
+        <dependency>
+            <groupId>com.inspur</groupId>
+            <artifactId>smsb-customer-manager-app</artifactId>
+            <version>0.0.1-SNAPSHOT</version>
+        </dependency>
+        <dependency>
+            <groupId>org.springframework.boot</groupId>
+            <artifactId>spring-boot-starter-test</artifactId>
+            <scope>test</scope>
+        </dependency>
+        <!-- dubbo -->
+        <dependency>
+            <groupId>com.alibaba.cloud</groupId>
+            <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>com.alibaba.cloud</groupId>
+            <artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>org.springframework.cloud</groupId>
+            <artifactId>spring-cloud-starter-bootstrap</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>org.springframework.boot</groupId>
+            <artifactId>spring-boot-test</artifactId>
+            <scope>test</scope>
+        </dependency>
+        <dependency>
+            <groupId>junit</groupId>
+            <artifactId>junit</artifactId>
+            <scope>test</scope>
+        </dependency>
+    </dependencies>
+
+    <build>
+        <plugins>
+            <plugin>
+                <groupId>org.springframework.boot</groupId>
+                <artifactId>spring-boot-maven-plugin</artifactId>
+                <configuration>
+                    <layers>
+                        <enabled>true</enabled>
+                    </layers>
+                    <executable>true</executable>
+                </configuration>
+                <executions>
+                    <execution>
+                        <goals>
+                            <goal>repackage</goal>
+                        </goals>
+                    </execution>
+                </executions>
+            </plugin>
+        </plugins>
+    </build>
+
+</project>

+ 24 - 0
smsb-customer-manager-start/src/test/java/com/inspur/customer/KeycloakTest.java

@@ -0,0 +1,24 @@
+package com.inspur.customer;
+
+import com.inspur.customer.service.client.keycloak.KeycloakService;
+import lombok.extern.slf4j.Slf4j;
+import org.apache.dubbo.config.annotation.DubboReference;
+import org.junit.jupiter.api.Test;
+import org.springframework.boot.test.context.SpringBootTest;
+
+/**
+ * @author linwenhua
+ * @date 2022-06-14 17:20
+ **/
+@Slf4j
+@SpringBootTest
+class KeycloakTest {
+
+    @DubboReference
+    private KeycloakService keycloakService;
+
+    @Test
+    void getUsersInRole() {
+        log.info("user: {}", keycloakService.getUsersInRole("ROLE_SUPER_ADMIN"));
+    }
+}