【问题标题】:Keycloak how to access DB from protocol mapperKeycloak 如何从协议映射器访问数据库
【发布时间】:2022-01-21 23:47:00
【问题描述】:

我使用协议映射器使用自定义数据库中的数据来丰富令牌。我应该如何部署驱动程序以在协议映射器中使用?如果 II 将驱动程序复制到 /standalone/lib/ext keycloak 文件夹中,则当映射器执行时,我会收到错误

SQL exception occuredjava.sql.SQLException: No suitable driver found for jdbc:oracle:thin:@.......:1521/CASDB

驱动程序应该放在哪里?是否真的需要将驱动部署为keycloak模块?

我的协议映射器代码

@Override
protected void setClaim(IDToken token, ProtocolMapperModel mappingModel, UserSessionModel userSession, KeycloakSession keycloakSession, ClientSessionContext clientSessionCtx) {
    String field = mappingModel.getConfig().get(FIELD_NAME);
    String type = mappingModel.getConfig().get(TYPE);

    String value = "Test " + type;

    System.out.println(">>>>>>>>>>>> " + type);

    try {
        DriverManager.registerDriver(new oracle.jdbc.driver.OracleDriver());
        Connection con = DriverManager.getConnection(
                "jdbc:oracle:thin:@....:1521/CASDB",
                "....",
                "....");
        Statement stmt = con.createStatement();
        ResultSet rs = stmt.executeQuery("SELECT * FROM CUSTOMER where CUSTOMER_ID = .....");

        rs.close();
        stmt.close();
        con.close();
    } catch (SQLException e) {
        System.out.println("SQL exception occured" + e);
    } finally {

    }


    OIDCAttributeMapperHelper.mapClaim(token, mappingModel, value);
}

错误是

12:54:40,579 ERROR [org.keycloak.services.error.KeycloakErrorHandler] (default task-6) Uncaught server error: java.lang.NoClassDefFoundError: oracle/jdbc/driver/OracleDriver
at com.betex.keycloak.mapper.UserAttributeMapper.setClaim(UserAttributeMapper.java:72)
at org.keycloak.protocol.oidc.mappers.AbstractOIDCProtocolMapper.transformUserInfoToken(AbstractOIDCProtocolMapper.java:71)
at org.keycloak.protocol.oidc.TokenManager.lambda$transformUserInfoAccessToken$8(TokenManager.java:716)
at java.util.stream.ForEachOps$ForEachOp$OfRef.accept(ForEachOps.java:184)
at java.util.stream.ReferencePipeline$2$1.accept(ReferencePipeline.java:175)
at java.util.ArrayList.forEach(ArrayList.java:1257)
at java.util.stream.SortedOps$RefSortingSink.end(SortedOps.java:390)
at java.util.stream.Sink$ChainedReference.end(Sink.java:258)
at java.util.stream.Sink$C

但是如果通过 wildfly 数据源测试连接,它可以正常工作

【问题讨论】:

    标签: jdbc keycloak datasource


    【解决方案1】:

    我找到了在wildfly服务器上创建XADatasource并通过协议映射器代码中的JNDI获取它的解决方案。其中 DatasourceName 是 Wildfly 数据源配置中定义的名称

    示例代码:

    InitialContext initialContext = new InitialContext();
    Context context = (Context) initialContext.lookup("java:jboss");
    DataSource DATASOURCE = (DataSource) context.lookup("/datasources/DatasourceName");
    

    【讨论】:

      猜你喜欢
      • 2021-06-27
      • 2018-07-15
      • 2018-04-19
      • 2020-06-18
      • 2019-04-04
      • 2020-12-02
      • 2019-01-01
      • 2018-04-24
      • 2021-06-23
      相关资源
      最近更新 更多