Spring boot 声明中未获取KeyClope自定义属性

Spring boot 声明中未获取KeyClope自定义属性,spring-boot,spring-security,keycloak,Spring Boot,Spring Security,Keycloak,我正试图从KeyClope获取一个声明形式的自定义属性(电话号码)。我正在遵循所给出的步骤。下面是我执行的步骤的附加屏幕图 向用户添加属性 协议映射器 协议映射器可在客户端范围->评估中为上述客户端提供 我现在尝试在过滤器中访问此属性,如下所示 public class FilterTest extends OncePerRequestFilter { public static final String PHONE_NUMBER = "phone_numbe

我正试图从KeyClope获取一个声明形式的自定义属性(电话号码)。我正在遵循所给出的步骤。下面是我执行的步骤的附加屏幕图

  • 向用户添加属性
  • 协议映射器
  • 协议映射器可在客户端范围->评估中为上述客户端提供
  • 我现在尝试在过滤器中访问此属性,如下所示

    
    public class FilterTest extends OncePerRequestFilter {
        
        public static final String PHONE_NUMBER = "phone_number";    
    
        public FilterTest() {
        }
    
        @Override
        protected void doFilterInternal(
                final HttpServletRequest request,
                final HttpServletResponse response,
                final FilterChain filterChain) throws ServletException, IOException {
    
            final Authentication authentication = SecurityContextHolder.getContext().getAuthentication();
    
            if( !AnonymousAuthenticationToken.class.isAssignableFrom(authentication.getClass()) ){
                Principal principal = (Principal) authentication.getPrincipal();
                if (principal instanceof KeycloakPrincipal) {
                    KeycloakPrincipal<KeycloakSecurityContext> kp = (KeycloakPrincipal<KeycloakSecurityContext>) principal;
                    AccessToken token = kp.getKeycloakSecurityContext().getToken();
                    Map<String, Object> otherClaims = token.getOtherClaims();
                    System.out.println("Phone number => "+otherClaims.get(PHONE_NUMBER); // null pointer
                }
            }    
            filterChain.doFilter(request, response);
    
        }
    
    }
    
    
    公共类筛选器测试扩展了OncePerRequestFilter{
    公共静态最终字符串PHONE\u NUMBER=“PHONE\u NUMBER”;
    公共过滤器测试(){
    }
    @凌驾
    受保护的空过滤器内部(
    最终HttpServletRequest请求,
    最终HttpServletResponse响应,
    最终筛选链(FilterChain)抛出ServletException、IOException{
    最终身份验证=SecurityContextHolder.getContext().getAuthentication();
    如果(!AnonymousAuthenticationToken.class.isAssignableFrom(authentication.getClass())){
    主体=(主体)身份验证。getPrincipal();
    if(keydeposprincipal的主体实例){
    keydeproprincipal kp=(keydeprincipal)主体;
    AccessToken-token=kp.GetKeyDopperSecurityContext().getToken();
    Map otherClaims=token.getOtherClaims();
    System.out.println(“Phone number=>”+otherClaims.get(Phone_number);//空指针
    }
    }    
    filterChain.doFilter(请求、响应);
    }
    }
    
    我尝试过的其他东西

  • 清除领域缓存
  • 添加内置的电话号码协议映射器
  • 上述两个步骤也没有给我带来任何结果


    我不确定我在这里缺少了什么。非常感谢您的帮助。

    KeyClope正在将一些公共字段从自定义属性直接映射到类的字段。在我的情况下,电话号码是IDToken类中的一个字段,我正试图从
    其他声明
    映射中获取它。下面是代码snip中的更改别让我跑起来

                    AccessToken token = kp.getKeycloakSecurityContext().getToken();
                    phoneNumber = token.getPhoneNumber();