簡體   English   中英

Spring Boot SSH Mysql?

[英]Spring Boot SSH Mysql?

我可以通過工作台成功連接到我的openshift mysql,如何通過我的spring啟動應用程序執行相同操作?

在我的application.properties中:

# Connection url for the database
spring.datasource.url = jdbc:mysql://<SSH_username>:<SSH_password>@<mysql_hostname>:<mysql_port>/<mysql_schema>

# Username and password
spring.datasource.username = <mysql_username>
spring.datasource.password = <mysql_password>

我在哪里提供私鑰?

為了通過SSH從本地應用程序訪問您的Mysql服務器(例如使用MySql-Openshift),您需要做的“唯一”額外事情是在DataSource對象嘗試獲取之前建立先前的SSH連接一個連接。

像往常一樣,幸運的是,有幾種方法可以做到這一點,但我會嘗試解釋對我有用的最簡單的方法。

1) 將Jcraft庫添加到類路徑 (用於處理SSH連接)

如果您使用Maven添加到您的pom.xml這些元素:

   <dependency>
        <groupId>com.jcraft</groupId>
        <artifactId>jsch</artifactId>
        <version>0.1.53</version>
    </dependency>

或者只是從http://www.jcraft.com/jsch/下載

2) 創建一個連接SSH服務器的類 (這里,我們使用上一步導入的庫)

例如:

import com.jcraft.jsch.JSch;
import com.jcraft.jsch.Session;

public class SSHConnection {

private final static String S_PATH_FILE_PRIVATE_KEY = "C:\\Users\\Val\\.ssh\\privatekeyputy.ppk"; \\windows absolut path of our ssh private key locally saved
private final static String S_PATH_FILE_KNOWN_HOSTS = "C:\\Users\\Val\\.ssh\\known_hosts";
private final static String S_PASS_PHRASE = "mypassphrase";
private final static int LOCAl_PORT = 3307; 
private final static int REMOTE_PORT = 3306; 
private final static int SSH_REMOTE_PORT = 22; 
private final static String SSH_USER = "87a34c7f89f5cf407100093c";
private final static String SSH_REMOTE_SERVER = "myapp-mydomain.rhcloud.com";
private final static String MYSQL_REMOTE_SERVER = "127.6.159.102";

private Session sesion; //represents each ssh session

public void closeSSH ()
{
    sesion.disconnect();
}

public SSHConnection () throws Throwable
{

    JSch jsch = null;

        jsch = new JSch();
        jsch.setKnownHosts(S_PATH_FILE_KNOWN_HOSTS);
        jsch.addIdentity(S_PATH_FILE_PRIVATE_KEY, S_PASS_PHRASE.getBytes());

        sesion = jsch.getSession(SSH_USER, SSH_REMOTE_SERVER, SSH_REMOTE_PORT);
        sesion.connect(); //ssh connection established!

        //by security policy, you must connect through a fowarded port          
        sesion.setPortForwardingL(LOCAl_PORT, MYSQL_REMOTE_SERVER, REMOTE_PORT); 

}
}

此類保留用於建立SSH連接的所有相關信息。 請注意,我們只定義了兩個方法:構造函數,用於實例化ssh連接,由類的唯一非靜態字段表示,以及其他方法,以斷開連接/關閉ssh連接。

3) 定義一個實現ServletContextListener接口的監聽器 (保存在步驟2中定義的類的對象)

請注意,我們嘗試在應用啟動時創建ssh連接,在應用程序死亡時關閉它。

@WebListener
public class MyContextListener implements ServletContextListener {

private SSHConnection conexionssh;


public MyContextListener() 
{
    super();
}

/**
 * @see ServletContextListener#contextInitialized(ServletContextEvent)
 */
public void contextInitialized(ServletContextEvent arg0) 
{
    System.out.println("Context initialized ... !");
    try 
        {
            conexionssh = new SSHConnection();
        } 
    catch (Throwable e) 
        {
            e.printStackTrace(); // error connecting SSH server
        }
}

/**
 * @see ServletContextListener#contextDestroyed(ServletContextEvent)
 */
public void contextDestroyed(ServletContextEvent arg0) 
{
    System.out.println("Context destroyed ... !");
    conexionssh.closeSSH(); // disconnect
}

4)使用Spring,像往常一樣在dispatcher-servlet.xml中設置DataSource對象, 但是指向你的fowarded端口

<bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource">
    <property name="driverClassName" value="com.mysql.jdbc.Driver" />
    <property name="url" value="jdbc:mysql://localhost:3307/yourSchema" />
    <property name="username" value="admin4ajCbcWM" />
    <property name="password" value="dxvfwEfbyaPL-z" />
</bean>

就這樣。 另一種可能性是創建自己的DataSource,擴展Spring提供的數據源,並添加ssh功能。 也許這里詳述的解決方案更好地隔離。

在openshift中,您可以直接連接到MySQL數據庫。

Openshift為您提供了一組環境變量。 請參閱: https//developers.openshift.com/en/managing-environment-variables.html#database-variables

您需要使用它們進行連接

在您的application.properties您可以使用如下環境變量:

spring.xxx=${OPENSHIFT_MYSQL_DB_HOST:localhost}

其中OPENSHIFT_MYSQL_DB_HOST是環境變量名稱, localhost是默認值。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM