paulwong

          OIDC - KEYCLOAK - 自定義CLIENT SCOPE

          當CLIENT或用戶在KEYCLOAK中成功登錄后,會返回JWT字符串,其中默認含有權(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)限的信息輸出到一個KEY中,這時可以新增自定義CLIENT SCOPE。Mapper中新增KEYCLOAK已內(nèi)置的【realm roles/client roles】,定義輸出到JTW的字段名:my-roles。
          • 授權(quán)哪些CLIENT可以讀取此CLIENT SCOPE.
          • 在登錄參數(shù)scope中,加入此值:my-roles,這樣在輸出的JWT就會以平面的方式輸出所有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) 評論(0)  編輯  收藏 所屬分類: OAUTH2KEYCLOAK

          主站蜘蛛池模板: 康马县| 英超| 正蓝旗| 安乡县| 乌什县| 井冈山市| 南宫市| 宜阳县| 皋兰县| 定远县| 宜春市| 古田县| 波密县| 新民市| 如皋市| 什邡市| 琼海市| 定日县| 陆川县| 榆林市| 凯里市| 鹿邑县| 云南省| 南澳县| 宁陵县| 嘉义市| 苗栗市| 保康县| 桦南县| 张家川| 珠海市| 定西市| 海林市| 冕宁县| 铁力市| 建瓯市| 萍乡市| 许昌县| 桂东县| 自治县| 泾阳县|