Code Monkey home page Code Monkey logo

ivangfr / springboot-ldap-testcontainers Goto Github PK

View Code? Open in Web Editor NEW
32.0 3.0 27.0 1.93 MB

The goal of this project is to create a simple Spring Boot REST API, named 'simple-service,' and secure it using the Spring Security LDAP module. Additionally, Testcontainers will be utilized for integration testing.

Java 96.74% Shell 3.26%
spring-boot openldap graalvm testcontainers docker java ldap phpldapadmin springdoc-openapi spring-security

springboot-ldap-testcontainers's Introduction

springboot-ldap-testcontainers

The goal of this project is to create a simple Spring Boot REST API, named simple-service, and secure it using the Spring Security LDAP module. Additionally, Testcontainers will be utilized for integration testing.

Proof-of-Concepts & Articles

On ivangfr.github.io, I have compiled my Proof-of-Concepts (PoCs) and articles. You can easily search for the technology you are interested in by using the filter. Who knows, perhaps I have already implemented a PoC or written an article about what you are looking for.

Additional Readings

Project Diagram

project-diagram

Application

  • simple-service

    Spring Boot Java Web application that exposes two endpoints:

    • GET /api/public: that can be access by anyone, it is not secured;
    • GET /api/private: that can just be accessed by users authenticated with valid LDAP credentials.

Prerequisites

Start Environment

Open a terminal and inside springboot-ldap-testcontainers root folder run

docker compose up -d

Import OpenLDAP Users

The LDIF file we will use, simple-service/src/main/resources/ldap-mycompany-com.ldif, contains a pre-defined structure for mycompany.com. Basically, it has 2 groups (employees and clients) and 3 users (Bill Gates, Steve Jobs and Mark Cuban). Besides, it's defined that Bill Gates and Steve Jobs belong to employees group and Mark Cuban belongs to clients group.

Bill Gates > username: bgates, password: 123
Steve Jobs > username: sjobs, password: 123
Mark Cuban > username: mcuban, password: 123

There are two ways to import those users: by running a script; or by using phpldapadmin

Import users running a script

  • In a terminal, make use you are in springboot-ldap-testcontainers root folder

  • Run the following script

    ./import-openldap-users.sh
    
  • Check users imported using ldapsearch

    ldapsearch -x -D "cn=admin,dc=mycompany,dc=com" \
      -w admin -H ldap://localhost:389 \
      -b "ou=users,dc=mycompany,dc=com" \
      -s sub "(uid=*)"
    

Import users using phpldapadmin

  • Access https://localhost:6443

  • Login with the following credentials

    Login DN: cn=admin,dc=mycompany,dc=com
    Password: admin
    
  • Import the file simple-service/src/main/resources/ldap-mycompany-com.ldif

  • You should see something like

    phpldapadmin

Run application with Maven

  • In a terminal, make use you are in springboot-ldap-testcontainers root folder

  • Run the following command to start simple-service

    ./mvnw clean spring-boot:run --projects simple-service
    

Run application as Docker container

  • In a terminal, make sure you are in springboot-ldap-testcontainers root folder

  • Build Docker Image

    • JVM
      ./docker-build.sh
      
    • Native
      ./docker-build.sh native
      
  • Environment Variables

    Environment Variable Description
    LDAP_HOST Specify host of the LDAP to use (default localhost)
    LDAP_PORT Specify port of the LDAP to use (default 389)
  • Run Docker Container

    docker run --rm --name simple-service -p 8080:8080 \
      -e LDAP_HOST=openldap \
      --network springboot-ldap-testcontainers_default \
      ivanfranchin/simple-service:1.0.0
    

Testing using curl

  1. Open a terminal

  2. Call the endpoint /api/public

    curl -i localhost:8080/api/public
    

    It should return

    HTTP/1.1 200
    It is public.
    
  3. Try to call the endpoint /api/private without credentials

    curl -i localhost:8080/api/private
    

    It should return

    HTTP/1.1 401
    
  4. Call the endpoint /api/private again. This time informing username and password

    curl -i -u bgates:123 localhost:8080/api/private
    

    It should return

    HTTP/1.1 200
    bgates, it is private.
    
  5. Call the endpoint /api/private informing an invalid password

    curl -i -u bgates:124 localhost:8080/api/private
    

    It should return

    HTTP/1.1 401 
    
  6. Call the endpoint /api/private informing a non-existing user

    curl -i -u cslim:123 localhost:8080/api/private
    

    It should return

    HTTP/1.1 401
    

Testing using Swagger

  1. Access http://localhost:8080/swagger-ui.html

    swagger

  2. Click GET /api/public to open it; then, click Try it out button and, finally, Execute button.

    It should return

    Code: 200
    Response Body: It is public.
    
  3. Click Authorize button (green-white one, located at top-right of the page)

  4. In the form that opens, provide the Bill Gates credentials, i.e, username bgates and password 123. Then, click Authorize button, and to finalize, click Close button

  5. Click GET /api/private to open it; then click Try it out button and, finally, Execute button.

    It should return

    Code: 200
    Response Body: bgates, it is private.
    

Shutdown

  • To stop simple-service application, go to the terminal where it is running and press Ctrl+C
  • To stop and remove docker compose containers, network and volumes, in a terminal and inside springboot-ldap-testcontainers root folder, run the following command
    docker compose down -v
    

Running Test Cases

  • In a terminal, make sure you are inside springboot-ldap-testcontainers root folder

  • Run the command below to start the Unit Tests

    ./mvnw clean test --projects simple-service
    
  • Run the command below to start the Unit and Integration Tests

    Note: Testcontainers will start automatically OpenLDAP Docker container before some tests begin and will shut it down when the tests finish.

    ./mvnw clean verify --projects simple-service
    

Cleanup

To remove the Docker image created by this project, go to a terminal and, inside springboot-ldap-testcontainers root folder, run the following script

./remove-docker-images.sh

springboot-ldap-testcontainers's People

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    ๐Ÿ–– Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. ๐Ÿ“Š๐Ÿ“ˆ๐ŸŽ‰

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google โค๏ธ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.