Я разработал собственное хранилище пользователей, которое расширяет UniqueIDJDBCUserStoreManager для обработки входа в систему клиента (клиента домена), но когда я развертываю этот пакет, вход администратора больше не работает, я не знаю, почему он запускает соединение с базой данных пользовательского хранилища, в журналах я можно увидеть, что он вызывает функцию doGetUserNameFromUserIDWithID в классе UniqueIDJDBCUserStoreManager. Следовательно, я получил ошибку SQL, так как использую неправильный пароль БД (проверьте следующие журналы). Вопрос в том, почему без моего пакета администратор может нормально войти в консоль, когда я развертываю пакет JAR вместе с пользовательским хранилищем xml (например, customer.xml), администратор пытается использовать это вторичное хранилище для аутентификации вместо основного хранилища?
Пожалуйста, поддержите, спасибо,
Детали конфигурации PFB
URL-адрес консоли wso2is 5.11: https://localhost:9443/carbon/admin/login.jsp
Пользовательский класс Java хранилища пользователей:
org.wso2.emkan.user.store.manager.SecondaryCustomUserStore
public class SecondaryCustomUserStore extends UniqueIDJDBCUserStoreManager{...}
фрагмент пользовательского хранилища xml: /repository/deployment/server/userstores/customer.xml:
<?xml version = "1.0" encoding = "UTF-8"?><UserStoreManager class = "org.wso2.emkan.user.store.manager.SecondaryCustomUserStore">
<Property name = "url">jdbc:oracle:thin:@//test.com</Property>
<Property name = "userName">test1</Property>
<Property encrypted = "true" name = "password">wrong_password</Property>
<Property name = "driverName">oracle.jdbc.driver.OracleDriver</Property>
Фрагмент развертывания.toml:
[super_admin]
username = "admin"
password = "admin"
create_admin_account = true
[user_store]
type = "read_write_ldap_unique_id"
connection_url = "ldap://localhost:${Ports.EmbeddedLDAP.LDAPServerPort}"
connection_name = "uid=admin,ou=system"
connection_password = "admin"
base_dn = "dc=wso2,dc=org"
[database.identity_db]
url = "jdbc:oracle:thin:@(DESCRIPTION=(ADDRESS=(PROTOCOL=TCP)(HOST=host.docker.internal)(PORT=1521))(CONNECT_DATA=(SERVER=DEDICATED)(SERVICE_NAME=orclpdb2)))"
username = "user"
password = "Id@333333"
driver = "oracle.jdbc.OracleDriver"
[user_store_mgt]
allowed_user_stores=["org.wso2.carbon.user.core.jdbc.UniqueIDJDBCUserStoreManager", "org.wso2.carbon.user.core.ldap.UniqueIDActiveDirectoryUserStoreManager","org.wso2.carbon.user.core.ldap.UniqueIDReadOnlyLDAPUserStoreManager","org.wso2.carbon.user.core.ldap.UniqueIDReadWriteLDAPUserStoreManager","org.wso2.emkan.user.store.manager.SecondaryCustomUserStore"]
Журналы ошибок:
wso2is511_1 | [2022-10-18 17:46:44,984] [8e36165e-ad29-4520-890f-9624450ce205] ИНФОРМАЦИЯ {org.wso2.emkan.user.store.manager.SecondaryCustomUserStore} — второй aryCustomUserStore doGetUserNameFromUserIDWithID...userID=56c92c55-519e-4e53-af03-916c41005e24 wso2is511_1 | [2022-10-18 17:46:50,842] [8e36165e-ad29-4520-890f-9624450ce205] ОШИБКА {org.apache.tomcat.jdbc.pool.ConnectionPool} — невозможно создать инициализацию все соединения пула. java.sql.SQLException: ORA-01017: неверное имя пользователя/пароль; вход запрещен wso2is511_1 | wso2is511_1 | в oracle.jdbc.driver.T4CTTIoer11.processError(T4CTTIoer11.java:494) wso2is511_1 | в oracle.jdbc.driver.T4CTTIoer11.processError(T4CTTIoer11.java:441) wso2is511_1 | в oracle.jdbc.driver.T4CTTIoer11.processError(T4CTTIoer11.java:436) wso2is511_1 | в oracle.jdbc.driver.T4CTTIfun.processError(T4CTTIfun.java:1027) wso2is511_1 | в oracle.jdbc.driver.T4CTTIoauthenticate.processError(T4CTTIoauthenticate.java:551) wso2is511_1 | в oracle.jdbc.driver.T4CTTIfun.receive(T4CTTIfun.java:537) wso2is511_1 | в oracle.jdbc.driver.T4CTTIfun.doRPC(T4CTTIfun.java:255) wso2is511_1 | в oracle.jdbc.driver.T4CTTIoauthenticate.doOAUTH(T4CTTIoauthenticate.java:500) wso2is511_1 | в oracle.jdbc.driver.T4CTTIoauthenticate.doOAUTH(T4CTTIoauthenticate.java:1280) wso2is511_1 | в oracle.jdbc.driver.T4CConnection.logon(T4CConnection.java:690) wso2is511_1 | в oracle.jdbc.driver.PhysicalConnection.connect(PhysicalConnection.java:782) wso2is511_1 | в oracle.jdbc.driver.T4CDriverExtension.getConnection(T4CDriverExtension.java:39) wso2is511_1 | в oracle.jdbc.driver.OracleDriver.connect(OracleDriver.java:704) wso2is511_1 | в org.apache.tomcat.jdbc.pool.PooledConnection.connectUsingDriver(PooledConnection.java:319) wso2is511_1 | в org.apache.tomcat.jdbc.pool.PooledConnection.connect(PooledConnection.java:212) wso2is511_1 | в org.apache.tomcat.jdbc.pool.ConnectionPool.createConnection(ConnectionPool.java:744) wso2is511_1 | в org.apache.tomcat.jdbc.pool.ConnectionPool.borrowConnection(ConnectionPool.java:676) wso2is511_1 | в org.apache.tomcat.jdbc.pool.ConnectionPool.init(ConnectionPool.java:483) wso2is511_1 | в org.apache.tomcat.jdbc.pool.ConnectionPool.(ConnectionPool.java:154) wso2is511_1 | в org.apache.tomcat.jdbc.pool.DataSourceProxy.pCreatePool(DataSourceProxy.java:118) wso2is511_1 | в org.apache.tomcat.jdbc.pool.DataSourceProxy.createPool(DataSourceProxy.java:107) wso2is511_1 | в org.apache.tomcat.jdbc.pool.DataSourceProxy.getConnection(DataSourceProxy.java:131) wso2is511_1 | на org.wso2.carbon.user.core.jdbc.JDBCUserStoreManager.getDBConnection(JDBCUserStoreManager.java:1197) wso2is511_1 | на org.wso2.carbon.user.core.jdbc.UniqueIDJDBCUserStoreManager.doGetUserNameFromUserIDWithID(UniqueIDJDBCUserStoreManager.java:1344) wso2is511_1 | в org.wso2.emkan.user.store.manager.SecondaryCustomUserStore.doGetUserNameFromUserIDWithID(SecondaryCustomUserStore.java:62) wso2is511_1 | на org.wso2.carbon.user.core.common.AbstractUserStoreManager.getUserStoreInternalWithId(AbstractUserStoreManager.java:7286)
Насколько я понял, это ожидаемо. Похоже, что из deployment.toml вы настроили вторичное пользовательское хранилище пользователей в качестве своего хранилища пользователей. Я не вижу никакой конфигурации для другой конфигурации хранилища основного пользователя. В этом случае в пользовательском хранилище xml-файла, если вы используете неправильный пароль, он не сможет войти в систему с базой данных оракула.
Уважаемый Buddhima, я обновил Deployment.toml, не могли бы вы взглянуть еще раз, обратите внимание, что у меня все еще та же проблема, поскольку я понимаю первичное хранилище в [user_store], по умолчанию это LDAP RW, а в [user_store_mgt] я добавил класс быть доступным в консоли управления. Но проблема в том, что при развертывании пакета (JAR) вход в систему как администратор больше не работает. Итак, как лучше всего определить вторичное хранилище в файле deployment.toml, не затрагивая основное хранилище?
@SalimR Вам просто нужно определить класс менеджера хранилища пользователей в deployment.toml
под allowed_user_stores
(я вижу, вы это сделали). Вы можете добавить вторичное хранилище пользователей из углеродной консоли.
Теперь я могу войти в систему как администратор вместе с развертыванием своего пользовательского хранилища, теперь пользовательское хранилище отличается от основного. Я изменил расширение класса пользовательского хранилища (SecondaryCustomUserStore) с UniqueIDJDBCUserStoreManager на JDBCUserStoreManager и использовал реализацию методов 5.9. Также обновлен файл развертывания.
public class SecondaryCustomUserStore extends JDBCUserStoreManager {....}
[super_admin]
admin_role = "admin"
username = "admin"
password = "admin"
create_admin_account= true
[user_store]
type = "read_write_ldap_unique_id"
connection_url = "ldap://localhost:${Ports.EmbeddedLDAP.LDAPServerPort}"
connection_name = "uid=admin,ou=system"
connection_password = "admin"
base_dn = "dc=wso2,dc=org"
[user_store_mgt]
allowed_user_stores=["org.wso2.carbon.user.core.ldap.UniqueIDReadWriteLDAPUserStoreManager","org.wso2.carbon.user.core.jdbc.UniqueIDJDBCUserStoreManager", "org.wso2.carbon.user.core.ldap.UniqueIDActiveDirectoryUserStoreManager","org.wso2.carbon.user.core.ldap.UniqueIDReadOnlyLDAPUserStoreManager","org.wso2.emkan.user.store.manager.SecondaryCustomUserStore"]
[database.identity_db]
............
[database.shared_db]
...........
Если вы смогли исправить это, изменив тип с UniqueIDJDBCUserStoreManager
на JDBCUserStoreManager
, скорее всего, вы пропустили добавление конфигурации в конфигурации пользовательского хранилища, в которой говорилось, что пользовательское хранилище поддерживает возможность уникального идентификатора. Если ваш пользовательский магазин не поддерживает это, есть большая вероятность, что он потерпит неудачу при повторении через пользовательские хранилища.
функциональность пользовательского магазина - это другое дело. Я проверяю это сейчас, где я могу добавить эту конфигурацию в хранилище пользователей, чтобы сказать, что она поддерживает уникальный идентификатор? Я думаю, что wso2is поддерживает обратную совместимость (5.11 поддерживает хранилище пользователей 5.9). Спасибо за вашу поддержку. Однако я открою новый тикет, если у меня возникнет проблема с пользовательским магазином.
Во-первых, вам нужно настроить это как вторичное хранилище пользователей. Поскольку это расширение UniqueIDJDBCUserStoreManager
, вам нужно расширить еще несколько методов, чем в JDBCUserStoreManager
IS 5.11.0 поддерживает обратную совместимость, чтобы вы могли развернуть существующую реализацию, учитывая, что зависимости соответствуют IS 5.11.0.
да связка 5.9 работает в 5.11
@SalimR Вам просто нужно определить класс менеджера хранилища пользователей в deployment.toml
под allowed_user_stores
(я вижу, вы это сделали). Вы можете добавить вторичное хранилище пользователей из углеродной консоли.
При добавлении пользовательского вторичного пользовательского хранилища вам не нужно вносить какие-либо изменения в
deployment.toml
, кроме конфигурацииallowed_user_stores
. Поэтому можете ли вы попробовать отменить любую конфигурацию, которую вы сделали в любом из файлов, и запустить пакет сервера идентификации? Также не забудьте удалить все ненужные файлы, которые вы создали вручную.