简体   繁体   English

无法在 WebFilter 中将 Principal 强制转换为 KeycloakPrincipal 但 servlet 没有问题

[英]Can not cast Principal to KeycloakPrincipal in a WebFilter but no problem with servlet

Environment:环境:

  • Jboss7.2 Jboss7.2
  • Keycloak 6.0.1钥匙斗篷 6.0.1
  • Java 11 Java 11

I am trying to cast Principal to get Keycloak user information, but I receive a ClassCastException.我正在尝试强制转换 Principal 以获取 Keycloak 用户信息,但我收到了 ClassCastException。 WebFilter and WebServlet are in different maven modules. WebFilter 和 WebServlet 位于不同的 maven 模块中。

org.keycloak.KeycloakPrincipal is in unnamed module of loader 'org.keycloak.keycloak-core@11.0.2' @4d7642f0; org.keycloak.KeycloakPrincipal 位于加载程序 'org.keycloak.keycloak-core@11.0.2' @4d7642f0 的未命名模块中; org.keycloak.KeycloakPrincipal is in unnamed module of loader 'deployment.app.ear' @4d7682a1 org.keycloak.KeycloakPrincipal 位于加载程序“deployment.app.ear”@4d7682a1 的未命名模块中

Error log错误日志

cast: java.lang.ClassCastException: 
    class org.keycloak.KeycloakPrincipal cannot be cast to class org.keycloak.KeycloakPrincipal       
    (org.keycloak.KeycloakPrincipal is in unnamed module of loader 'org.keycloak.keycloak-core@11.0.2' @4d7642f0; org.keycloak.KeycloakPrincipal is in unnamed module of loader 'deployment.app.ear' @4d7682a1
...

pom.xml (root) pom.xml(根)

...
<modules>
   <module>app-back</module> <!--where webservlet is-->
   <module>app-ejb</module> <!--where webfilter is-->
   <module>app-ear</module>
</modules>
...

WebFilter CAST KO WebFilter CAST KO

@WebFilter(filterName = "Filter", urlPatterns = "/*")
public class FilterPrincipal implements Filter {
    ...

    @Override
    public void doFilter(ServletRequest req, ServletResponse resp, FilterChain chain) throws java.io.IOException, ServletException {
        ...
        HttpServletRequest sReq = ((HttpServletRequest) req);
        
        KeycloakPrincipal<KeycloakSecurityContext> kp = (KeycloakPrincipal<KeycloakSecurityContext>) principal;//error
        
        KeycloakSecurityContext keycloakSecurityContext = kp.getKeycloakSecurityContext();

        AccessToken token = keycloakSecurityContext.getToken();
        writer.println("username = " + token.getPreferredUsername());
        
        ...
        chain.doFilter(req, resp);
    }
    ...
    
**WebServlet CAST OK**

@WebServlet(urlPatterns = "/principal")
public class PrincipalInfoServlet extends HttpServlet {

    ...

    @SuppressWarnings("unchecked")
    @Override
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws IOException {

        ...
        Principal principal = request.getUserPrincipal();
        if (principal != null) {
            ...

            // API keycloak
            if (principal instanceof KeycloakPrincipal<?>) {
                writer.println("--------------------------------");
                writer.println("Informació del token de keycloak:");

                KeycloakPrincipal<KeycloakSecurityContext> kp = (KeycloakPrincipal<KeycloakSecurityContext>) principal;//OK
                KeycloakSecurityContext keycloakSecurityContext = kp.getKeycloakSecurityContext();
    ...

I found a workaround by moving webservlet to maven modul app-back so the KeycloakPrincipals are in the same module.我通过将 webservlet 移动到 maven modul app-back 找到了一种解决方法,因此 KeycloakPrincipals 在同一个模块中。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

相关问题 ClassCastException:DispatcherServlet无法强制转换为Servlet - ClassCastException: DispatcherServlet cannot be cast to Servlet 无法将DispatcherServlet强制转换为具有提供范围的javax.servlet.Servlet - DispatcherServlet cannot be cast to javax.servlet.Servlet with scope provided WebAppInitializer无法强制转换为javax.servlet.ServletContainerInitializer - WebAppInitializer cannot be cast to javax.servlet.ServletContainerInitializer 无法将Maven强制转换为javax.servlet.Filter - Maven cannot be cast to javax.servlet.Filter java.lang.ClassCastException:org.glassfish.jersey.servlet.ServletContainer无法转换为javax.servlet.Servlet - java.lang.ClassCastException: org.glassfish.jersey.servlet.ServletContainer cannot be cast to javax.servlet.Servlet ClassCastException:org.springframework.web.servlet.DispatcherServlet无法转换为javax.servlet.Servlet - ClassCastException: org.springframework.web.servlet.DispatcherServlet cannot be cast to javax.servlet.Servlet WebFilter Java8 和 Maven - WebFilter Java8 and Maven 在 RESTful Web 应用程序中映射 servlet 的问题 - Problem with mapping servlet in RESTful web application ClasscastException:MyClass无法转换为javax.servlet.Filter - ClasscastException : MyClass cannot be cast to javax.servlet.Filter java.lang.ClassCastException:class org.springframework.web.servlet.DispatcherServlet 无法转换为 class jakarta.servlet.Servlet - java.lang.ClassCastException: class org.springframework.web.servlet.DispatcherServlet cannot be cast to class jakarta.servlet.Servlet
 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM