avatarMohammed Waris

Free AI web copilot to create summaries, insights and extended knowledge, download it at here

4535

Abstract

            <h2>jna-platform-5.9.0.jar</h2>
            <div><h3>Shared with Dropbox</h3></div>
            <div><p>www.dropbox.com</p></div>
          </div>
          <div>
            <div style="background-image: url(https://miro.readmedium.com/v2/resize:fit:320/0*xC8V8HI9b0N2SkQc)"></div>
          </div>
        </div>
      </a>
    </div><p id="2a91">Lets add these JARs to our project.</p><p id="5cd0">Create a libs folder inside our project’s root folder and these JARs to that folder.</p><figure id="3a28"><img src="https://cdn-images-1.readmedium.com/v2/resize:fit:800/1*F1teSmPPARFlZHcfaX2_OA.png"><figcaption></figcaption></figure><p id="8add">add following dependencies in the pom.xml file.</p><div id="88c1"><pre><span class="hljs-tag">&lt;<span class="hljs-name">dependency</span>&gt;</span>
<span class="hljs-tag">&lt;<span class="hljs-name">groupId</span>&gt;</span>szczepaniak.dariusz.java.jna<span class="hljs-tag">&lt;/<span class="hljs-name">groupId</span>&gt;</span>
<span class="hljs-tag">&lt;<span class="hljs-name">artifactId</span>&gt;</span>windows.credential.manager<span class="hljs-tag">&lt;/<span class="hljs-name">artifactId</span>&gt;</span>
<span class="hljs-tag">&lt;<span class="hljs-name">version</span>&gt;</span>0.0.1-SNAPSHOT<span class="hljs-tag">&lt;/<span class="hljs-name">version</span>&gt;</span>
<span class="hljs-tag">&lt;<span class="hljs-name">scope</span>&gt;</span>system<span class="hljs-tag">&lt;/<span class="hljs-name">scope</span>&gt;</span>
<span class="hljs-tag">&lt;<span class="hljs-name">systemPath</span>&gt;</span>${basedir}/libs/windows.credential.manager-0.0.1-SNAPSHOT.jar<span class="hljs-tag">&lt;/<span class="hljs-name">systemPath</span>&gt;</span>

<span class="hljs-tag"></<span class="hljs-name">dependency</span>></span> <span class="hljs-tag"><<span class="hljs-name">dependency</span>></span> <span class="hljs-tag"><<span class="hljs-name">groupId</span>></span>net.java.dev.jna<span class="hljs-tag"></<span class="hljs-name">groupId</span>></span> <span class="hljs-tag"><<span class="hljs-name">artifactId</span>></span>jna<span class="hljs-tag"></<span class="hljs-name">artifactId</span>></span> <span class="hljs-tag"><<span class="hljs-name">version</span>></span>5.9.0<span class="hljs-tag"></<span class="hljs-name">version</span>></span> <span class="hljs-tag"><<span class="hljs-name">scope</span>></span>system<span class="hljs-tag"></<span class="hljs-name">scope</span>></span> <span class="hljs-tag"><<span class="hljs-name">systemPath</span>></span>{basedir}/libs/jna-5.9.0.jar<span class="hljs-tag">&lt;/<span class="hljs-name">systemPath</span>&gt;</span> <span class="hljs-tag">&lt;/<span class="hljs-name">dependency</span>&gt;</span> <span class="hljs-tag">&lt;<span class="hljs-name">dependency</span>&gt;</span> <span class="hljs-tag">&lt;<span class="hljs-name">groupId</span>&gt;</span>net.java.dev.jna<span class="hljs-tag">&lt;/<span class="hljs-name">groupId</span>&gt;</span> <span class="hljs-tag">&lt;<span class="hljs-name">artifactId</span>&gt;</span>jna-platform<span class="hljs-tag">&lt;/<span class="hljs-name">artifactId</span>&gt;</span> <span class="hljs-tag">&lt;<span class="hljs-name">version</span>&gt;</span>5.9.0<span class="hljs-tag">&lt;/<span class="hljs-name">version</span>&gt;</span> <span class="hljs-tag">&lt;<span class="hljs-name">scope</span>&gt;</span>system<span class="hljs-tag">&lt;/<span class="hljs-name">scope</span>&gt;</span> <span class="hljs-tag">&lt;<span class="hljs-name">systemPath</span>&gt;</span>{basedir}/libs/jna-platform-5.9.0.jar<span class="hljs-tag"></<span class="hljs-name">systemPath</span>></span> <span class="hljs-tag"></<span class="hljs-name">dependency</span>></span></pre></div><p id="5cad">Lets add these database properties in the application.properties file.</p><div id="0481"><pre>db.username=root db.password= spring.datasource.url=jdbc:mysql://localhost:3306/testdb spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver spring.datasource.username=<span class="hljs-variable">{db.username}</span> spring.datasource.password=<span class="hljs-variable">{db.password}</span></pre></div><figure id="800d"><img src="https://cdn-images-1.readmedium.com/v2/resize:fit:800/1*Th6kRlHZZwY7KAFzpkWR-w.png"><figcaption></figcaption></figure><p id="e84e">we have set the db.passwor

Options

d to empty string. Lets run the application.</p><figure id="84e0"><img src="https://cdn-images-1.readmedium.com/v2/resize:fit:800/1*XGfqBefTQf_jwVofh54DWA.png"><figcaption></figcaption></figure><p id="da0b">Application is unable to start and it is showing in the log that we have not provided the password.</p><h1 id="758a">Setting the database password</h1><p id="907d">Add a package name config and create a class named ConfigPropertyListener inside it.</p><figure id="06f9"><img src="https://cdn-images-1.readmedium.com/v2/resize:fit:800/1*zjNEen6eEilQb-fczefiEQ.png"><figcaption></figcaption></figure><div id="c15f"><pre><span class="hljs-comment">/* com.example.demo.config.ConfigPropertyListener.java */</span>

<span class="hljs-keyword">package</span> com.example.demo.config;

<span class="hljs-keyword">import</span> learning.jna.credenumerate.GenericWindowsCredentials; <span class="hljs-keyword">import</span> learning.jna.credenumerate.WindowsCredentialManager; <span class="hljs-keyword">import</span> org.springframework.boot.context.event.ApplicationEnvironmentPreparedEvent; <span class="hljs-keyword">import</span> org.springframework.context.ApplicationListener; <span class="hljs-keyword">import</span> org.springframework.core.env.ConfigurableEnvironment; <span class="hljs-keyword">import</span> org.springframework.core.env.PropertiesPropertySource; <span class="hljs-keyword">import</span> java.util.Properties;

<span class="hljs-keyword">public</span> <span class="hljs-keyword">class</span> <span class="hljs-title class_">ConfigPropertyListener</span> <span class="hljs-keyword">implements</span> <span class="hljs-title class_">ApplicationListener</span><ApplicationEnvironmentPreparedEvent> {

<span class="hljs-meta">@Override</span>
<span class="hljs-keyword">public</span> <span class="hljs-keyword">void</span> <span class="hljs-title function_">onApplicationEvent</span><span class="hljs-params">(ApplicationEnvironmentPreparedEvent event)</span> {
    <span class="hljs-type">ConfigurableEnvironment</span> <span class="hljs-variable">environment</span> <span class="hljs-operator">=</span> event.getEnvironment();
    <span class="hljs-type">WindowsCredentialManager</span> <span class="hljs-variable">wcm</span> <span class="hljs-operator">=</span> <span class="hljs-keyword">new</span> <span class="hljs-title class_">WindowsCredentialManager</span>();
    <span class="hljs-type">GenericWindowsCredentials</span> <span class="hljs-variable">gwc</span> <span class="hljs-operator">=</span> wcm.getByTargetName(<span class="hljs-string">"testdb"</span>);
    <span class="hljs-type">String</span> <span class="hljs-variable">dbPassword</span> <span class="hljs-operator">=</span> gwc.getPassword();
    <span class="hljs-type">Properties</span> <span class="hljs-variable">properties</span> <span class="hljs-operator">=</span> <span class="hljs-keyword">new</span> <span class="hljs-title class_">Properties</span>();
    properties.put(<span class="hljs-string">"db.password"</span>, dbPassword);
    environment.getPropertySources().addFirst(<span class="hljs-keyword">new</span> <span class="hljs-title class_">PropertiesPropertySource</span>(<span class="hljs-string">"myProperties"</span>, properties));
}

}</pre></div><p id="39b1">Code is self-explanatory, we are creating a WindowsCredentialManager object and retrieving GenericWindowsCredentials object along with credential entry we have added to store our database password.</p><p id="e9e6">Setting the retrieved password into a properties object and passing the properties object to the method of environment object.</p><p id="bf76">Now create a folder named META-INF inside resources folder and create a file spring.factories inside it, put the following line in that file.</p><div id="a424"><pre><span class="hljs-attr">org.springframework.context.ApplicationListener</span>=com.example.demo.config.ConfigPropertyListener</pre></div><figure id="f310"><img src="https://cdn-images-1.readmedium.com/v2/resize:fit:800/1*amVVBkS9kzCv45a85CZKcg.png"><figcaption></figcaption></figure><p id="561b">Lets run the application again.</p><figure id="9573"><img src="https://cdn-images-1.readmedium.com/v2/resize:fit:800/1*1zwG7f39qbBnSEmfdOimlQ.png"><figcaption></figcaption></figure><p id="56c9">Application started successfully, this means application is able to get the database password from windows credential manager and made a successfull connection to mysql database.</p></article></body>

Spring Boot — Override config property value before the application startup

In this article we are going to create a spring boot application in which we will set the database password by reading them from the windows credential manager.

Lets create a new spring boot project from https://start.spring.io/ with dependencies Spring web, Spring data jpa, Lombok and MySql driver.

Your project structure should look like this

Open this project in Intellij idea.

Database

Lets create a mysql database or you can use any existing database. I have created a database by name testdb and we will try to make connection to this database through our spring boot app.

Windows Credential Manager

Lets add an entry in the windows credential manager for our database username and password.

Click on add a generic credential.

Password I used here is root.

Click OK to save the credential.

Windows Credential Manager Java API

We will be using this Java api to retrieve the username and password from windows credential manager.

You can download the JAR and its dependencies here.

Lets add these JARs to our project.

Create a libs folder inside our project’s root folder and these JARs to that folder.

add following dependencies in the pom.xml file.

<dependency>
    <groupId>szczepaniak.dariusz.java.jna</groupId>
    <artifactId>windows.credential.manager</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <scope>system</scope>
    <systemPath>${basedir}/libs/windows.credential.manager-0.0.1-SNAPSHOT.jar</systemPath>
</dependency>
<dependency>
    <groupId>net.java.dev.jna</groupId>
    <artifactId>jna</artifactId>
    <version>5.9.0</version>
    <scope>system</scope>
    <systemPath>${basedir}/libs/jna-5.9.0.jar</systemPath>
</dependency>
<dependency>
    <groupId>net.java.dev.jna</groupId>
    <artifactId>jna-platform</artifactId>
    <version>5.9.0</version>
    <scope>system</scope>
    <systemPath>${basedir}/libs/jna-platform-5.9.0.jar</systemPath>
</dependency>

Lets add these database properties in the application.properties file.

db.username=root
db.password=
spring.datasource.url=jdbc:mysql://localhost:3306/testdb
spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver
spring.datasource.username=${db.username}
spring.datasource.password=${db.password}

we have set the db.password to empty string. Lets run the application.

Application is unable to start and it is showing in the log that we have not provided the password.

Setting the database password

Add a package name config and create a class named ConfigPropertyListener inside it.

/*
  com.example.demo.config.ConfigPropertyListener.java
*/

package com.example.demo.config;

import learning.jna.credenumerate.GenericWindowsCredentials;
import learning.jna.credenumerate.WindowsCredentialManager;
import org.springframework.boot.context.event.ApplicationEnvironmentPreparedEvent;
import org.springframework.context.ApplicationListener;
import org.springframework.core.env.ConfigurableEnvironment;
import org.springframework.core.env.PropertiesPropertySource;
import java.util.Properties;

public class ConfigPropertyListener implements ApplicationListener<ApplicationEnvironmentPreparedEvent> {

    @Override
    public void onApplicationEvent(ApplicationEnvironmentPreparedEvent event) {
        ConfigurableEnvironment environment = event.getEnvironment();
        WindowsCredentialManager wcm = new WindowsCredentialManager();
        GenericWindowsCredentials gwc = wcm.getByTargetName("testdb");
        String dbPassword = gwc.getPassword();
        Properties properties = new Properties();
        properties.put("db.password", dbPassword);
        environment.getPropertySources().addFirst(new PropertiesPropertySource("myProperties", properties));
    }
}

Code is self-explanatory, we are creating a WindowsCredentialManager object and retrieving GenericWindowsCredentials object along with credential entry we have added to store our database password.

Setting the retrieved password into a properties object and passing the properties object to the method of environment object.

Now create a folder named META-INF inside resources folder and create a file spring.factories inside it, put the following line in that file.

org.springframework.context.ApplicationListener=com.example.demo.config.ConfigPropertyListener

Lets run the application again.

Application started successfully, this means application is able to get the database password from windows credential manager and made a successfull connection to mysql database.

Spring Boot
Configuration
Override
Config
Runtime
Recommended from ReadMedium