paulwong

          OIDC - KEYCLOAK - 自定義CLIENT SCOPE

          當(dāng)CLIENT或用戶在KEYCLOAK中成功登錄后,會(huì)返回JWT字符串,其中默認(rèn)含有權(quán)限的信息,但此信息以內(nèi)嵌的方式呈現(xiàn),非常不方便。
          "resource_access": {
              "app-springboot-confidential": {
                "roles": [
                  "user"
                ]
              },
              "test-employee-service": {
                "roles": [
                  "READ_EMPLOYEE"
                ]
              },
              "service-springboot": {
                "roles": [
                  "READ_PRODUCTS"
                ]
              },
              "account": {
                "roles": [
                  "manage-account",
                  "manage-account-links"
                ]
              },
              "test-department-service": {
                "roles": [
                  "READ_DEPARTMENT"
                ]
              }
            }

          • 需要將權(quán)限的信息輸出到一個(gè)KEY中,這時(shí)可以新增自定義CLIENT SCOPE。Mapper中新增KEYCLOAK已內(nèi)置的【realm roles/client roles】,定義輸出到JTW的字段名:my-roles。
          • 授權(quán)哪些CLIENT可以讀取此CLIENT SCOPE.
          • 在登錄參數(shù)scope中,加入此值:my-roles,這樣在輸出的JWT就會(huì)以平面的方式輸出所有roles
          "my-roles": [
              "user",
              "READ_EMPLOYEE",
              "READ_PRODUCTS",
              "manage-account",
              "manage-account-links",
              "READ_DEPARTMENT",
              "offline_access",
              "user"
            ]

          • SPRING SECURITY中取出權(quán)限信息:

          @Bean
              public ReactiveJwtAuthenticationConverter jwtAuthenticationConverter(ObjectMapper objectMapper) {
                  
                  JwtGrantedAuthoritiesConverter jwtGrantedAuthoritiesConverter = new JwtGrantedAuthoritiesConverter();
                  jwtGrantedAuthoritiesConverter.setAuthorityPrefix("ROLE_");
                  jwtGrantedAuthoritiesConverter.setAuthoritiesClaimName("my-roles");
                  
          //        KeycloakRealmRoleConverter keycloakRealmRoleConverter = new KeycloakRealmRoleConverter(objectMapper);
                  
                  ReactiveJwtGrantedAuthoritiesConverterAdapter reactiveJwtGrantedAuthoritiesConverterAdapter = 
                          new ReactiveJwtGrantedAuthoritiesConverterAdapter(
          //                        new KeycloakRealmRoleConverter(objectMapper);
                                  jwtGrantedAuthoritiesConverter
                              );
                  
                  ReactiveJwtAuthenticationConverter jwtConverter = new ReactiveJwtAuthenticationConverter();
                  jwtConverter.setJwtGrantedAuthoritiesConverter(reactiveJwtGrantedAuthoritiesConverterAdapter);
                  
                  return jwtConverter;
              }

          • 判斷是否有權(quán)限

          ServerHttpSecurity
                      .authorizeExchange(
                          a -> a.pathMatchers("/", "/error").permitAll()
                                .matchers(PathRequest.toStaticResources().atCommonLocations()).permitAll()
                                .pathMatchers(HttpMethod.GET, "/protected/**").hasRole("READ_DEPARTMENT")
                                .anyExchange()
                                .authenticated()
                       )

          posted on 2021-12-22 11:15 paulwong 閱讀(760) 評(píng)論(0)  編輯  收藏 所屬分類: OAUTH2KEYCLOAK

          主站蜘蛛池模板: 垣曲县| 屏边| 桦南县| 定日县| 胶南市| 湖州市| 内黄县| 禄劝| 军事| 井冈山市| 承德县| 绵阳市| 金昌市| 日照市| 娱乐| 清水河县| 黎川县| 南丹县| 芦山县| 托里县| 阜宁县| 慈溪市| 嵊泗县| 启东市| 安平县| 海城市| 保亭| 张家川| 嘉定区| 长武县| 禄丰县| 南昌市| 榆社县| 镇康县| 青州市| 黄龙县| 根河市| 雅安市| 鞍山市| 镇平县| 长白|