Keycloak中扩展OIDCLoginProtocol仅修改authenticated方法方案咨询
Keycloak扩展OIDC Login协议自定义authenticated方法实现方案
有,不需要修改Keycloak源码,直接通过Keycloak的服务提供商接口(SPI)扩展即可,仅需重写目标方法,其他逻辑保留官方默认实现,步骤如下:
步骤1:创建自定义OIDC协议实现类
继承Keycloak官方的OIDCLoginProtocol类,仅重写你需要修改的authenticated方法即可,示例代码结构如下:
public class CustomOIDCLoginProtocol extends OIDCLoginProtocol { @Override public Response authenticated(AuthenticationSessionModel authSession, UserSessionModel userSession, ClientSessionContext clientSessionCtx) { // 此处编写你的自定义业务逻辑 // 如果需要复用原有流程,可先调用super.authenticated()获取返回结果后再做二次处理 return super.authenticated(authSession, userSession, clientSessionCtx); } }
步骤2:创建自定义协议的提供者工厂类
实现LoginProtocolProviderFactory接口,用于向Keycloak注册你的自定义OIDC协议:
public class CustomOIDCLoginProtocolFactory implements LoginProtocolProviderFactory<OIDCLoginProtocol> { // 自定义协议ID,后续管理后台配置时会用到 public static final String PROTOCOL_ID = "custom-oidc"; @Override public OIDCLoginProtocol create(KeycloakSession session) { return new CustomOIDCLoginProtocol(); } @Override public void init(Config.Scope config) { // 按需添加初始化逻辑,无特殊需求可留空 } @Override public void postInit(KeycloakSessionFactory factory) { // 按需添加后置初始化逻辑,无特殊需求可留空 } @Override public void close() { // 按需添加资源释放逻辑,无特殊需求可留空 } @Override public String getId() { return PROTOCOL_ID; } }
步骤3:注册SPI实现
在你的项目resources/META-INF/services目录下新建名为org.keycloak.protocol.LoginProtocolProviderFactory的文件,文件内容填写你自定义工厂类的全限定类名,示例:
com.yourcompany.keycloak.protocol.CustomOIDCLoginProtocolFactory
步骤4:部署并配置客户端
- 将项目打包为jar包,放入Keycloak安装目录的
providers文件夹下,重启Keycloak服务 - 进入Keycloak管理后台,打开需要使用自定义协议的客户端配置页,将协议选项切换为你自定义的
custom-oidc即可生效
注意:如果你的自定义逻辑需要兼容OIDC标准能力,重写
authenticated方法时尽量先调用父类的对应方法,再基于返回结果做修改,避免破坏标准OIDC登录流程。
内容的提问来源于stack exchange,提问作者Nury Garryyev
相关产品推荐
相关产品推荐

