فهرست منبع

fix: 小程序获取token接口增加groupList、realmRoles、resourceRoles字段

zengweijie 3 سال پیش
والد
کامیت
ce656d4d8a

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

@@ -8,6 +8,7 @@ import org.apache.dubbo.config.annotation.DubboService;
 import org.keycloak.admin.client.Keycloak;
 import org.keycloak.admin.client.resource.RealmResource;
 import org.keycloak.admin.client.resource.UserResource;
+import org.keycloak.representations.idm.ClientRepresentation;
 import org.keycloak.representations.idm.GroupRepresentation;
 import org.keycloak.representations.idm.RoleRepresentation;
 import org.keycloak.representations.idm.UserRepresentation;
@@ -188,6 +189,33 @@ public class KeycloakServiceImpl implements KeycloakService {
         return keycloak.realm(realm).users().get(userId).groups().stream().map(GroupRepresentation::getPath).collect(Collectors.toList());
     }
 
+    @Override
+    public List<String> getUserRealmRoles(String userId) {
+        return keycloak.realm(realm)
+            .users()
+            .get(userId)
+            .roles()
+            .getAll()
+            .getRealmMappings()
+            .stream()
+            .map(RoleRepresentation::getName)
+            .collect(Collectors.toList());
+    }
+
+    @Override
+    public Map<String, List<String>> getUserClientRoles(String userId) {
+        Map<String, List<String>> resultMap = new HashMap<>();
+        List<ClientRepresentation> clientList = keycloak.realm(realm).clients().findAll();
+        for (ClientRepresentation clientRepresentation : clientList) {
+            String clientId = clientRepresentation.getClientId();
+            List<RoleRepresentation> roleList = keycloak.realm(realm).users().get(userId).roles().clientLevel(clientRepresentation.getId()).listEffective();
+            if (!roleList.isEmpty()) {
+                resultMap.put(clientId, roleList.stream().map(RoleRepresentation::getName).collect(Collectors.toList()));
+            }
+        }
+        return resultMap;
+    }
+
     private List<KeycloakUserCO> getUserByRoleAndGroup(String group, String role) {
         if (!StringUtils.hasText(group) || !StringUtils.hasText(role)) {
             return Collections.emptyList();

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

@@ -73,4 +73,8 @@ public interface KeycloakService {
     List<KeycloakUserCO> searchUserByAttrEntry(List<Pair> entries);
 
     List<String> getUserGroupPathList(String userId);
+
+    List<String> getUserRealmRoles(String userId);
+
+    Map<String, List<String>> getUserClientRoles(String userId);
 }

+ 3 - 2
smsb-customer-manager-start-web/src/test/java/com/inspur/customer/KeycloakTest.java

@@ -4,12 +4,13 @@ import com.inspur.customer.service.client.keycloak.KeycloakService;
 import lombok.extern.slf4j.Slf4j;
 import org.junit.jupiter.api.Test;
 import org.keycloak.admin.client.Keycloak;
-import org.keycloak.representations.idm.UserRepresentation;
+import org.keycloak.representations.idm.*;
 import org.springframework.beans.factory.annotation.Value;
 import org.springframework.boot.test.context.SpringBootTest;
 
 import javax.annotation.Resource;
 import java.util.List;
+import java.util.Map;
 import java.util.Optional;
 
 /**
@@ -19,7 +20,7 @@ import java.util.Optional;
  **/
 @Slf4j
 @SpringBootTest
-public class KeycloakTest {
+class KeycloakTest {
     @Resource
     Keycloak keycloak;
     @Value("${keycloak.realm}")