声明中未获取 Keycloak 自定义属性
Keycloak custom attribute not fetched in the claims
我正在尝试以 Keycloak 声明的形式获取自定义属性 (phone_number)。我正在按照给定的步骤进行操作 。下面附上我执行的步骤的屏幕截图。
- 正在为用户添加属性
- 协议映射器
- 协议映射器在客户端范围内可用 -> 对上述客户端进行评估
我现在正尝试按如下方式在过滤器中访问此属性。
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);
}
}
我尝试过的其他内容。
- 清除领域缓存。
- 添加内置 phone 号码协议映射器。
以上两步对我来说也没有任何结果。
我不确定我在这里遗漏了什么。感谢任何帮助。
Keycloak 正在将一些常用字段从自定义属性直接映射到 IDToken class 的字段。在我的例子中,phone 数字是 IDToken class 中的一个字段,我试图从 otherClaims
映射中获取它。以下是让我兴奋起来的代码片段的变化 运行.
AccessToken token = kp.getKeycloakSecurityContext().getToken();
phoneNumber = token.getPhoneNumber();
我正在尝试以 Keycloak 声明的形式获取自定义属性 (phone_number)。我正在按照给定的步骤进行操作
- 正在为用户添加属性
- 协议映射器
- 协议映射器在客户端范围内可用 -> 对上述客户端进行评估
我现在正尝试按如下方式在过滤器中访问此属性。
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);
}
}
我尝试过的其他内容。
- 清除领域缓存。
- 添加内置 phone 号码协议映射器。
以上两步对我来说也没有任何结果。
我不确定我在这里遗漏了什么。感谢任何帮助。
Keycloak 正在将一些常用字段从自定义属性直接映射到 IDToken class 的字段。在我的例子中,phone 数字是 IDToken class 中的一个字段,我试图从 otherClaims
映射中获取它。以下是让我兴奋起来的代码片段的变化 运行.
AccessToken token = kp.getKeycloakSecurityContext().getToken();
phoneNumber = token.getPhoneNumber();