【发布时间】:2019-12-19 23:41:12
【问题描述】:
我正在尝试实现自定义 keycloack Authenticator SPI 以针对外部数据源进行身份验证。 Spring boot Rest Service 也有,我也可以用。
我要解决的用例是
向用户显示 keycloak 登录屏幕。 Onsubmission 用户已针对外部数据源进行验证。
从外部数据源检索一些属性,将其映射到 keycloak 的 id 和访问令牌。
还设置了同一用户同时登录多次的用户限制条件。
我在想,这可以通过检索 keycloak 数据源中可用的用户会话信息来解决。如果我使用外部数据源,keycloak 是否仍然维护会话信息?
我遵循了官方指南(https://www.keycloak.org/docs/latest/server_development/index.html#_auth_spi_walkthrough)的第 8.3 节,这与我需要的非常相似。
现在我按照第 11 节跳过并开始(https://www.keycloak.org/docs/latest/server_development/index.html#_user-storage-spi)似乎也更合适。
我从实现自定义身份验证器 SPI 开始,认为这不是正确的方法,现在实现了 UserStorageProvider。
/***
* From UserLookupProvider
*/
public UserModel getUserById(String id, RealmModel realm) {
System.out.println("ID: " + id + ":REALM:" + realm);
StorageId storageId = new StorageId(id);
/**
* StorageId.getExternalId() method is invoked to obtain
* the username embeded in the id parameter
*/
String username = storageId.getExternalId();
System.out.println("Name:" + username);
return getUserByUsername(username, realm);
}
/***
* From UserLookupProvider
* This method is invoked by the Keycloak login page when a user logs in
*/
public UserModel getUserByUsername(String username, RealmModel realm) {
System.out.println("USERNAME: " + username + ":REALM:" + realm);
UserModel userModel = loadedUsers.get(username);
if (userModel == null) {
String password = properties.getProperty(username);
if (password != null) {
userModel = createUserModel(realm, username);
System.out.println("New UserModel:");
System.out.println(userModel.toString());
loadedUsers.put(username, userModel);
}
}
return userModel;
}
protected UserModel createUserModel(RealmModel realm, String username) {
return new AbstractUserAdapter(session, realm, model) {
@Override
public String getUsername() {
return username;
}
};
}
关注文档(https://www.keycloak.org/docs/latest/server_development/index.html#packaging-and-deployment-2)
我们的提供者实现的类文件应该放在一个 jar 中。您还必须在 META-INF/services/org.keycloak.storage.UserStorageProviderFactory 文件中声明提供程序工厂类。
这里的问题是:我创建的jar在“META-INF”文件夹中没有服务目录,我需要手动创建并添加它吗?
org.keycloak.examples.federation.properties.FilePropertiesStorageFactory 创建 jar 后,您可以使用常规 WildFly 部署它,方法是:将 jar 复制到 deploy/ 目录或使用 JBoss CLI。
使用 maven 创建 jar 后,将 jar 复制到“keycloak-6.0.1\standalone\deployments”文件夹。但我在“用户联合列表”中没有看到我的提供商
任何建议/帮助将不胜感激!
提前感谢您的建议。
【问题讨论】:
标签: java keycloak keycloak-services