【问题标题】:Mysql issue with dns resolution. Spring boot - Connect to mysql db using a read-only userdns解析的Mysql问题。 Spring boot - 使用只读用户连接到 mysql db
【发布时间】:2017-03-09 14:05:42
【问题描述】:

我有一个只读用户,当我尝试启动我的 Spring Boot 应用程序时出现异常(使用密码是)。

用户权限:

mysql> show grants;
+---------------------------------------------------------------+
| Grants for myuser@%                                          |
+---------------------------------------------------------------+
| GRANT USAGE ON *.* TO 'mydb'@'%' IDENTIFIED BY PASSWORD 'xxx' |
| GRANT SELECT ON `mydb`.* TO 'myuser'@'%'                     |
+---------------------------------------------------------------+
2 rows in set (0,00 sec)

类数据库配置:

@Configuration
@EnableTransactionManagement
@EnableJpaRepositories(
    entityManagerFactoryRef = "mydbEntityManagerFactory",
    basePackages = {"co.com.xxx.persistence.telemercadeo"}
)
public class DatabaseConfig {

    /**
     * Logger to register events.
     */
    private static final Logger LOGGER = LoggerFactory.getLogger(DatabaseConfig.class);

    /**
     * Returns a data source for database connection (source).
     *
     * @return {@link DataSource}. Database connection representation.
     */
    @Bean(name = "mydbDataSource")
    @ConfigurationProperties(prefix = "mydb.jdbc")
    public DataSource sourceDataSource() {
        LOGGER.info("Loading data source for source");        
        return DataSourceBuilder.create().build();
    }

    @Bean(name = "mydbEntityManagerFactory")
    public LocalContainerEntityManagerFactoryBean entityManagerFactory(
            EntityManagerFactoryBuilder builder,
            @Qualifier("mydbDataSource") DataSource dataSource) {
        return builder
                .dataSource(dataSource)
                .packages("co.com.xxx.model.telemercadeo")
                .persistenceUnit("mydb")
                .build();
    }

    @Bean(name = "mydbTransactionManager")
    public PlatformTransactionManager transactionManager(
            @Qualifier("mydbEntityManagerFactory") EntityManagerFactory entityManagerFactory) {
        return new JpaTransactionManager(entityManagerFactory);
    }

}

我的 application.properties:

mydb.jdbc.url=jdbc:mysql://192.168.200.5:3306/mydb
mydb.jdbc.username=myuser
mydb.jdbc.password=mypass
mydb.jdbc.driverClassName=com.mysql.jdbc.Driver
spring.jpa.properties.hibernate.dialect = org.hibernate.dialect.MySQL5Dialect

当我启动应用程序时,我会得到下一个跟踪:

2017-03-09 08:34:34.635 [main] INFO  c.c.n.c.e.c.DatabaseConfig - Loading data source for source
2017-03-09 08:34:34.678 [main] INFO  o.s.o.j.LocalContainerEntityManagerFactoryBean - Building JPA container EntityManagerFactory for persistence unit 'mydb
2017-03-09 08:34:34.678 [main] INFO  o.h.jpa.internal.util.LogHelper - HHH000204: Processing PersistenceUnitInfo [
    name: mydb
    ...]
2017-03-09 08:34:34.740 [main] ERROR o.a.tomcat.jdbc.pool.ConnectionPool - Unable to create initial connections of pool.
java.sql.SQLException: Access denied for user 'myuser'@'SUBDOMAIN.MYDOMAIN.COM' (using password: YES)
2017-03-09 10:02:26.926 [main] WARN  o.h.e.j.e.i.JdbcEnvironmentInitiator - HHH000342: Could not obtain connection to query metadata : Access denied for user 'myuser'@'SUBDOMAIN.MYDOMAIN.COM' (using password: YES)

我的怀疑:

  • 无法连接到只读用户的数据库。
  • 拒绝用户 'myuser'@'SUBDOMAIN.MYDOMAIN.COM' 的访问。为什么会出现域名?

拥有所有权限的用户没有问题。但我需要连接只读用户。

Mysql版本:5.1

编辑

使用参数--skip-name-resolve true(如@wangyuntao建议的那样)重新启动mysql服务器后,异常更改为:

java.sql.SQLException: Access denied for user 'myuser'@'192.168.200.1' (using password: YES)

如果db的ip是192.168.200.5,为什么用户'myuser'@'192.168.200.1'的访问被拒绝(使用密码:YES)?

【问题讨论】:

    标签: java mysql spring-boot dns spring-data-jpa


    【解决方案1】:

    您需要从本地主机显式授予访问权限

    GRANT USAGE ON *.* TO 'mydb'@'localhost' IDENTIFIED BY PASSWORD 'xxx' 
    GRANT SELECT ON `mydb`.* TO 'my_user'@'localhost' 
    

    【讨论】:

    • 我连接到远程 IP。
    • 啊好吧,192.168.*** 看起来像本地地址 @victorpacheco3107
    • 好,我测试一下告诉你。
    • 我授予:GRANT SELECT ON mydb.* TO 'myuser'@'SUBDOMAIN.MYDOMAIN.COM' 。我可以通过命令行连接,但我得到相同的异常: java.sql.SQLException: Access denied for user 'myuser'@'SUBDOMAIN.MYDOMAIN.COM' (using password: YES) @baao
    【解决方案2】:

    我不太确定,但如果您愿意,可以尝试 skip-name-resolve 选项。

    如文件所述:

    server-system-variables

    此变量是根据 --skip-name-resolve 选项的值设置的。如果它是 OFF,mysqld 在检查客户端连接时解析主机名。如果为 ON,mysqld 只使用 IP 号;在这种情况下,授权表中的所有 Host 列值都必须是 IP 地址或 localhost。请参阅第 9.12.5.2 节,“DNS 查找优化和主机缓存”。

    host-cache

    要禁用 DNS 主机名查找,请使用 --skip-name-resolve 选项启动服务器。在这种情况下,服务器只使用 IP 地址而不是主机名来匹配连接主机到 MySQL 授权表中的行。只能使用这些表中使用 IP 地址指定的帐户。 (请确保存在指定 IP 地址的帐户,否则您可能无法连接。)


    编辑

    根据 MySQL 文档,这是我的测试,它适用于我。

    1. 创建由“mypass”标识的用户“jeffrey”;
    2. GRANT SELECT ON mydb.* TO 'jeffrey';

    然后您可以从其他机器连接到您的数据库,例如

    mysql -ujeffrey -pmypass -hYOUR_DB_IP
    

    【讨论】:

    • 我做过这些事情。但是现在例外更改:用户'myuser'@'192.168.200.1'的访问被拒绝(使用密码:YES)请检查server.log以获取更多详细信息。当db的ip为192.168.200.5
    • 192.168.200.1 应该是你应用机器的IP?
    • 你确定你用来连接db的用户名和密码正确吗?
    • 详情请参考GRANT Syntax的文档。
    • IP 192.168.200.1 不是应用程序的机器。我确定密码是正确的,我可以使用命令行连接,但是当我尝试使用 Mysql Workbench 连接时,会显示相同的消息。
    猜你喜欢
    • 1970-01-01
    • 2020-07-12
    • 2021-03-20
    • 2021-04-24
    • 2012-08-18
    • 2012-11-21
    • 1970-01-01
    • 2019-07-20
    • 2018-12-31
    相关资源
    最近更新 更多