Доступ запрещен для пользователя 'root' @ 'localhost' с двумя источниками данных в context.xml

У меня проблема с Java 8, MySQL Server 5.7.23, MySQL Connector для Java v5.1.45 и Tomcat v9.0.12 (работает на Ubuntu Server 18.04).

Я создал простое Java-приложение (war), которое выполняет запрос в базе данных MySQL.

Мой context.xml (я поместил 2 узла ресурсов, один для производства и один для среды разработки), из сценария реального приложения я прочитал из CATALINA_OPTS параметр с именем "env" и прочитал его с помощью System.getProperty (" env "), приложение может выбрать подходящий источник данных для использования.

<Context>
    <!-- MySQL - Production -->
    <Resource
        name="prod-jdbc/ds-1" auth="Container"
        type="javax.sql.DataSource" factory="org.apache.tomcat.jdbc.pool.DataSourceFactory"
        driverClassName="com.mysql.jdbc.Driver"
        url="jdbc:mysql://localhost:3306/testdb?useSSL=false"
        username="dbuser" password="dbUserPwd!"
        autoReconnect="true" maxTotal="10"
        minIdle="3" maxIdle="5" maxActive="10" maxWaitMillis="10000"
        removeAbandonedOnBorrow="true" removeAbandonedOnMaintenance="true"
        logAbandoned="true" removeAbandonedTimeout="1000"
        closeMethod="close" testOnBorrow="true"
        testWhileIdle="true" timeBetweenEvictionRunsMillis="60000"
        validationQueryTimeout="10" validationInterval="6000"
        validationQuery="SELECT 1"
    />

    <!-- MySQL - Development -->
    <Resource
        name="dev-jdbc/ds-1" auth="Container"
        type="javax.sql.DataSource" factory="org.apache.tomcat.jdbc.pool.DataSourceFactory"
        driverClassName="com.mysql.jdbc.Driver"
        url="jdbc:mysql://localhost:3306/localdb?useSSL=false"
        username="root" password="root"
        autoReconnect="true" maxTotal="10"
        minIdle="3" maxIdle="5" maxActive="10"
        maxWaitMillis="10000" removeAbandonedOnBorrow="true"
        removeAbandonedOnMaintenance="true" logAbandoned="true"
        removeAbandonedTimeout="1000" closeMethod="close"
        testOnBorrow="true" testWhileIdle="true"
        timeBetweenEvictionRunsMillis="60000" validationQueryTimeout="10"
        validationInterval="6000" validationQuery="SELECT 1"
    />
</Context>

Простой класс тестера:

package main;

import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import javax.naming.Context;
import javax.naming.InitialContext;
import javax.naming.NamingException;
import javax.servlet.ServletContextEvent;
import javax.servlet.ServletContextListener;
import javax.sql.DataSource;
import javax.ws.rs.core.Application;

public class ConnectionTester extends Application implements ServletContextListener {

    @Override
    public void contextInitialized(ServletContextEvent arg0) {
        Context ctx = null; Connection con = null; Statement stmt = null; ResultSet rs = null;
        try{
            ctx = new InitialContext();
            DataSource ds = (DataSource) ctx.lookup("java:/comp/env/prod-jdbc/ds-1");
            con = ds.getConnection();
            stmt = con.createStatement();
            rs = stmt.executeQuery("SELECT nome FROM Customers");
            while(rs.next()) {
                System.out.println(rs.getString("name"));
            }
        }
        catch(NamingException | SQLException e){
            e.printStackTrace();
        } 
        finally{
            try {
                rs.close(); stmt.close(); con.close(); ctx.close();
            } catch (SQLException e) {
                System.out.println("Exception in closing DB resources");
            } catch (NamingException e) {
                System.out.println("Exception in closing Context");
            }
        }
    } // contextInitialized
} // ConnectionTester

Я установил разрешение MySQL таким образом (мне также необходимо разрешить внешний доступ для dbuser, потому что у меня есть внешний клиент, который подключается к этой базе данных MySQL):

ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password BY 'veryStrongPwd';
CREATE USER 'dbuser'@'localhost' IDENTIFIED BY 'dbUserPwd!';
GRANT ALL PRIVILEGES ON *.* TO 'dbuser'@'localhost' WITH GRANT OPTION;
GRANT ALL PRIVILEGES ON *.* TO 'dbuser'@'%' IDENTIFIED BY 'dbUserPwd!' WITH GRANT OPTION;
FLUSH PRIVILEGES;

Tomcat не имеет какой-либо конкретной конфигурации или настроенного ресурса, это просто v9.0.12, распакованный в папке.

Я попытался поместить в context.xml учетные данные "root" и "dbuser", но при запуске Tomcat у меня возникает следующая проблема:

ConnectionPool.init Unable to create initial connections of pool.
 java.sql.SQLException: Access denied for user 'root'@'localhost' (using password: YES)
        at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:965)
        at com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:3973)
        at com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:3909)
        at com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:873)
        at com.mysql.jdbc.MysqlIO.proceedHandshakeWithPluggableAuthentication(MysqlIO.java:1710)
        at com.mysql.jdbc.MysqlIO.doHandshake(MysqlIO.java:1226)
...

И после выброса этих исключений он печатает набор записей, но зачем ему нужен root-доступ, даже если в context.xml я установил учетные данные dbuser?

Я прочитал искомый поиск в StackOverflow и прочитал, что должен проверить таблицу mysql.user, если я запустил:

SELECT user, host, plugin, authentication_string FROM mysql.user;

Я получаю это (столбец «plugin» имеет значение «mysql_native_password» для каждой записи):

Если я попытаюсь войти на сервер MySQL из оболочки с помощью:

mysql -u root (or dbuser) -p

Я могу успешно войти в систему.

РЕДАКТИРОВАТЬ: я обнаружил, что при удалении второго узла «Ресурс» из context.xml (созданного для среды разработки) проблема исчезает, но я до сих пор не понимаю, почему это происходит, потому что в поиске я выбираю ресурс prod (ctx.lookup ("java: /comp /env /prod-jdbc /ds-1")).

Чего мне не хватает? Заранее спасибо

4 голоса | спросил Roberto Milani 22 +03002018-10-22T00:54:41+03:00312018bEurope/MoscowMon, 22 Oct 2018 00:54:41 +0300 2018, 00:54:41

2 ответа


0
В вашем ---- +: = 0 =: + ---- у вас есть ---- +: = 1 =: + ---- пароль пользователя как ---- +: = 2 =: + ----В вашем сценарии MySQL вы установили ---- +: = 3 =: + ---- пароль пользователя на ---- +: = 4 =: + ---- .Если ваш вопрос больше о том, почему вы получаете ошибку, даже если вы не используете ---- +: = 5 =: + ---- - вы устанавливаете минимальный размер пула соединений на ---- +: = 6 =: + ---- .Таким образом, Tomcat создаст пул соединений и попытается добавить 3 соединения к нему при запуске.Возможно, если вы установите ---- +: = 7 =: + ---- в ---- +: = 8 =: + ---- это будет работать так, как вы хотите.ОБНОВИТЬЕсть еще один параметр - ---- +: = 9 =: + ----, который по умолчанию равен 10. Если установить значение 0, это остановит Tomcat при попытке использовать этот источник данных при запуске.
ответил Bernie 26 +03002018-10-26T02:36:43+03:00312018bEurope/MoscowFri, 26 Oct 2018 02:36:43 +0300 2018, 02:36:43
0
Попробуйте проверить разрешение [IP] от клиента, который вы используете для подключения.Иногда нужно быть конкретным, когда вы создаете нового клиента, который подключается с другого терминала, когда он не является локальным.
ответил Leo 26 +03002018-10-26T20:13:48+03:00312018bEurope/MoscowFri, 26 Oct 2018 20:13:48 +0300 2018, 20:13:48

Похожие вопросы

Популярные теги

security × 330linux × 316macos × 2827 × 268performance × 244command-line × 241sql-server × 235joomla-3.x × 222java × 189c++ × 186windows × 180cisco × 168bash × 158c# × 142gmail × 139arduino-uno × 139javascript × 134ssh × 133seo × 132mysql × 132