在WebLogic中配置Keycloak遇401问题:需额外配置吗?
看起来你碰到了两个关联的问题:WebLogic自带的认证机制和Keycloak过滤器的冲突,以及Keycloak适配器无法获取公钥的错误。我来一步步帮你解决:
一、WebLogic返回401 Unauthorized(即使请求已到达Keycloak Filter)
这个问题的核心是WebLogic的容器级认证在Keycloak Filter完成验证前就触发了,或者Keycloak验证通过后没有把用户信息注入WebLogic的安全上下文,导致WebLogic仍然认为请求未认证。
解决步骤:
确保Keycloak Filter优先执行
在你的web.xml中,把Keycloak Filter的<filter-mapping>放在所有其他过滤器的最前面,并且覆盖所有请求分发类型:<filter> <filter-name>OIDCFilter</filter-name> <filter-class>com.mytest.keycloak.OIDCFilter</filter-class> </filter> <filter-mapping> <filter-name>OIDCFilter</filter-name> <url-pattern>/*</url-pattern> <dispatcher>REQUEST</dispatcher> <dispatcher>FORWARD</dispatcher> <dispatcher>INCLUDE</dispatcher> <dispatcher>ERROR</dispatcher> </filter-mapping>这样能保证所有请求先经过Keycloak的认证逻辑。
禁用WebLogic的基础认证检查
在weblogic.xml的<container-descriptor>下添加配置,让WebLogic不要自动处理Authorization头的基础认证:<container-descriptor> <!-- 你的现有配置 --> <enforce-valid-basic-auth-credentials>false</enforce-valid-basic-auth-credentials> </container-descriptor>这个配置会阻止WebLogic对Bearer Token格式的
Authorization头进行无效的基础认证校验。将Keycloak认证后的用户注入WebLogic安全上下文
如果你的自定义OIDCFilter验证Token成功后,需要手动把用户主体加入WebLogic的安全上下文,这样WebLogic就不会再要求认证。在Filter的doFilter方法中添加:// 假设你已经验证了Token并获取到用户名 String username = token.getPreferredUsername(); Subject subject = new Subject(); subject.getPrincipals().add(new weblogic.security.principal.WLSUserImpl(username)); // 用WebLogic的Security.runAs方法继续执行请求 weblogic.security.Security.runAs(subject, () -> { chain.doFilter(request, response); return null; });这一步会告诉WebLogic:这个请求已经通过认证,用户是
username。
二、publicKey is not found错误(IO Error)
从日志看,Keycloak适配器无法连接到Keycloak服务器获取公钥,导致Token验证失败。常见原因及解决方法:
Docker容器网络连通性问题
如果你在Docker中部署Keycloak和WebLogic,注意容器内部的localhost不是宿主机的localhost。检查你的keycloak.json中的auth-server-url是否正确:- 不要用
https://localhost:8443/auth,而是用Keycloak容器的名称或内部IP,比如Keycloak容器名为keycloak,则配置为https://keycloak:8443/auth。 - 确保两个容器在同一个Docker网络中,启动容器时可以用
--network参数指定同一网络。
- 不要用
SSL证书信任问题
如果Keycloak使用自签名SSL证书,WebLogic容器的JVM不会信任这个证书,导致HTTPS请求失败。解决方法:- 导出Keycloak的证书:
keytool -export -alias server -file keycloak.crt -keystore /path/to/keycloak/standalone/configuration/keycloak.jks - 将证书导入WebLogic容器的JVM信任库:
keytool -import -alias keycloak -file keycloak.crt -keystore $WEBLOGIC_HOME/jdk/jre/lib/security/cacerts
(默认信任库密码是
changeit)- 导出Keycloak的证书:
适配器版本与Keycloak服务器版本不匹配
确保你的app.war中依赖的Keycloak适配器(比如keycloak-adapter-servlet、keycloak-core)版本是2.5.5.Final,和服务器版本完全一致。版本不匹配可能导致API调用失败。
总结建议
先解决公钥获取的问题(确保Keycloak适配器能正常连接服务器),再调整WebLogic的认证配置,这样Keycloak Filter验证通过后,WebLogic就能识别到已认证的用户,不会再返回401错误。
内容的提问来源于stack exchange,提问作者Edwin

