无法使用使用小写字母登录 Java 的用户连接到 Firebird 3.0



我用大写字母连接名称,但它不想在登录时用小写字母连接。

这是一个小测试

String ENCODING = "WIN1251";
String CONNECTION_URL = "jdbc:firebirdsql:localhost:C:/ProgramData/test.FDB";
Properties properties = new Properties();
properties.setProperty("encoding", ENCODING);
properties.setProperty("roleName", "GUEST");
properties.setProperty("user", "smoll2");
properties.setProperty("password", "1234567a");
DriverManager.getConnection(CONNECTION_URL, properties);
java.sql.SQLInvalidAuthorizationSpecException: Your user name and password are not defined. Ask your database administrator to set up a Firebird login. [SQLState:28000, ISC error code:335544472]
at org.firebirdsql.gds.ng.FbExceptionBuilder$Type$4.createSQLException(FbExceptionBuilder.java:572)
at org.firebirdsql.gds.ng.FbExceptionBuilder.toFlatSQLException(FbExceptionBuilder.java:302)
at org.firebirdsql.gds.ng.wire.AbstractWireOperations.readStatusVector(AbstractWireOperations.java:138)
at org.firebirdsql.gds.ng.wire.AbstractWireOperations.processOperation(AbstractWireOperations.java:202)
at org.firebirdsql.gds.ng.wire.AbstractWireOperations.readOperationResponse(AbstractWireOperations.java:161)
at org.firebirdsql.gds.ng.wire.version13.V13WireOperations.authReceiveResponse(V13WireOperations.java:122)
at org.firebirdsql.gds.ng.wire.version10.V10Database.authReceiveResponse(V10Database.java:569)
at org.firebirdsql.gds.ng.wire.WireConnection.identify(WireConnection.java:309)
at org.firebirdsql.gds.ng.wire.FbWireDatabaseFactory.performConnect(FbWireDatabaseFactory.java:51)
at org.firebirdsql.gds.ng.wire.FbWireDatabaseFactory.connect(FbWireDatabaseFactory.java:39)
at org.firebirdsql.gds.ng.wire.FbWireDatabaseFactory.connect(FbWireDatabaseFactory.java:32)
at org.firebirdsql.jca.FBManagedConnection.<init>(FBManagedConnection.java:141)
at org.firebirdsql.jca.FBManagedConnectionFactory.createManagedConnection(FBManagedConnectionFactory.java:550)
at org.firebirdsql.jca.FBStandAloneConnectionManager.allocateConnection(FBStandAloneConnectionManager.java:65)
at org.firebirdsql.jdbc.FBDataSource.getConnection(FBDataSource.java:124)
at org.firebirdsql.jdbc.FBDriver.connect(FBDriver.java:137)
at java.sql.DriverManager.getConnection(DriverManager.java:664)
at java.sql.DriverManager.getConnection(DriverManager.java:208)

基本上有四种情况会发生此身份验证错误:

  1. 用户不存在或密码错误
  2. 您使用区分大小写的用户名创建了用户,例如使用CREATE USER "smoll2" ...
  3. 您使用Legacy_UserManager创建了用户,并且正在使用Jaybird 4,默认情况下,它不再使用Legacy_Auth进行身份验证
  4. 用户被标记为不活动

我认为情况1不适用于此,但除此之外,您需要创建用户或更改其密码。

对于情况2,重要的是要认识到,由于Firebird 3.0,用户名是标识符,并且遵循与标识符相同的规则。这意味着未引用的名称以大写存储,并且不区分大小写匹配(通过大写(,而引用的名称则准确存储并按原样进行比较。如果您敏感地创建了用户大小写(CREATE USER "smoll2" ...(,则需要使用引用的用户名进行身份验证:

properties.setProperty("user", ""smoll2"");

如果你不这样做,你实际上是在针对用户SMOLL2(它不存在(进行身份验证。

对于案例3,自Firebird 3.0以来,Firebird提供了多个带有附带用户管理器的身份验证插件。每个用户管理器都有用户。自Jaybird 4以来,Jaybird默认情况下仅使用插件Srp256和Srp(共享Srp用户管理器(进行身份验证。如果您使用Legacy_UserManager创建用户(因为它是firebird.conf中UserManager中第一个配置的,或者因为您在创建用户时使用了using plugin Legacy_UserManager子句(,则无法使用Jaybird的默认设置进行身份验证,因为它没有尝试Legacy_Auth用户插件。

这种情况有两种解决方案:

  1. 使用Legacy_UserManager删除用户,并使用Srp用户管理器创建它

  2. 配置Jaybird也尝试Legacy_Auth:

    properties.setProperty("authPlugins", "Srp256,Srp,Legacy_Auth");
    

    如果您只想尝试Legacy_Auth,可以从列表中删除Srp256和Srp。

作为情况3的变体,如果您有Jaybird不支持的自定义用户管理器和身份验证插件,也可能发生这种情况。

最后是情况4,用户可以是非活动的(因为它是用INACTIVE子句创建的,或者被更改为非活动的(。不允许非活动用户进行身份验证。Legacy_UserManager/Legacy_Auth将忽略非活动状态。如果用户处于非活动状态,您可以使用再次激活它

alter user smoll2 set active

请注意,它也可以是2和3的组合(使用区分大小写的用户名Legacy_UserManager(。通过在当前数据库和安全数据库中以SYSDBA或具有RDB$ADMIN角色的用户身份执行以下查询,您可以验证您拥有哪个用户(如果该用户处于活动状态(以及哪个用户管理器:

select sec$user_name, sec$active, sec$plugin from sec$users;

对于Legacy_UserManager,SEC$ACTIVE列为NULL,因为它不支持活动/非活动状态。

最新更新