Spring boot 声明中未获取KeyClope自定义属性
我正试图从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
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();