Keycloak Tomcat 7适配器(3.4.3.Final版本)无法正常工作求助
咱一步步来捋,401一般都是认证流程里某个环节没对上,先从最基础的配置检查起:
1. 先确认适配器jar包放对地方了吗?
Tomcat 7的Keycloak适配器jar包必须丢到Tomcat_HOME/lib目录下,绝对不能塞到你的war包WEB-INF/lib里!因为适配器是和Tomcat容器集成的,得让容器的类加载器能读到它,放错位置直接就歇菜,赶紧检查挪位置试试。
2. 核对context.xml配置细节
不管是应用级的META-INF/context.xml还是Tomcat全局conf/context.xml,里面的Keycloak Realm配置必须和Keycloak控制台的客户端信息完全匹配,一个字符都不能错:
<Resource name="keycloak/KeycloakContext" auth="Container" type="org.keycloak.adapters.tomcat.KeycloakAuthenticatorValve" factory="org.keycloak.adapters.tomcat.KeycloakContextResourceFactory" realm="你的领域名称" auth-server-url="http://你的Keycloak服务器地址:端口/auth" ssl-required="external" resource="你的客户端ID" credentials="secret" client-secret="你的客户端密钥" use-resource-role-mappings="false" enable-basic-auth="false" />
划重点:
realm和Keycloak里的领域名要大小写完全一致auth-server-url得确保Tomcat服务器能访问到,别被防火墙挡住了- 如果你的客户端是
confidential类型,client-secret必须和Keycloak客户端Credentials页的密钥完全匹配
3. 检查web.xml的安全约束配置
要确保你在WEB-INF/web.xml里正确配置了需要保护的端点和对应角色:
<security-constraint> <web-resource-collection> <web-resource-name>Protected Resources</web-resource-name> <url-pattern>/*</url-pattern> <!-- 按需调整成你要保护的路径 --> </web-resource-collection> <auth-constraint> <role-name>你的角色名称</role-name> <!-- 要和Keycloak给用户分配的角色一致 --> </auth-constraint> </security-constraint> <login-config> <auth-method>KEYCLOAK</auth-method> <realm-name>你的领域名称</realm-name> </login-config> <security-role> <role-name>你的角色名称</role-name> </security-role>
如果用的是Keycloak客户端角色,记得把context.xml里的use-resource-role-mappings改成true;如果是领域角色就保持false。
4. 排查Spring Boot和Tomcat的兼容性坑
Spring Boot 1.5.2默认适配的是Tomcat 8.0.x,虽然官方说支持Tomcat7,但嵌入式Tomcat的依赖必须排除干净!打包war部署时,一定要在pom.xml里把嵌入式Tomcat设为provided:
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-tomcat</artifactId> <scope>provided</scope> </dependency>
要是没设这个,嵌入式Tomcat的jar会和外部Tomcat冲突,直接导致适配器没法正常工作。
5. 适配器和Keycloak服务器版本必须严格匹配!
这是个超级容易踩的大坑!你用的是3.4.3.Final的适配器,但看的是2.5的文档——Keycloak的适配器和服务器版本必须完全一致,跨大版本(比如适配器3.x配服务器2.x)绝对会认证失败!赶紧换成和Keycloak服务器同版本的适配器试试。
6. 开调试日志抓细节
要是上面的检查都没问题,那就开Keycloak的调试日志看具体报错。在Tomcat的conf/logging.properties里加两行:
org.keycloak.level = FINEST org.keycloak.handlers = java.util.logging.ConsoleHandler
重启Tomcat后访问端点,控制台会输出认证流程的每一步,比如是不是token没带上、token验证失败、角色不匹配这些细节,顺着日志就能精准定位问题了。
内容的提问来源于stack exchange,提问作者cactuschibre

