我正在尝试以来自 Keycloak 的声明形式获取自定义属性 (phone_number)。我正在按照 here 给出的步骤操作。以下是我执行的步骤的附加屏幕图。
我现在尝试在过滤器中访问此属性,如下所示。
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);
}
}
我尝试过的其他东西。
以上两个步骤对我来说也没有产生任何结果。
我不确定我在这里遗漏了什么。任何帮助表示赞赏。
答案 0 :(得分:2)
Keycloak 将自定义属性中的一些常见字段直接映射到 IDToken 类的字段。就我而言,电话号码是 IDToken 类中的一个字段,我试图从 otherClaims
地图中获取它。以下是让我启动并运行的代码片段更改。
AccessToken token = kp.getKeycloakSecurityContext().getToken();
phoneNumber = token.getPhoneNumber();