Showing posts with label Security. Show all posts
Showing posts with label Security. Show all posts

Wednesday, 22 October 2025

Building a CI/CD Security Pipeline with SAST, DAST, and Trivy in GitLab | 2025 Guide

October 22, 2025 0

Building a CI/CD Security Pipeline with SAST, DAST, and Trivy in GitLab

Complete CI/CD security pipeline in GitLab with SAST, DAST, and Trivy vulnerability scanning - DevSecOps implementation guide 2025

In 2025, DevSecOps isn't just a buzzword—it's a necessity. With cyber threats evolving at an unprecedented rate, integrating security directly into your CI/CD pipeline is no longer optional. This comprehensive guide will walk you through building a robust security pipeline using GitLab's native SAST capabilities, dynamic application security testing, and Trivy for vulnerability scanning. By the end, you'll have a production-ready pipeline that catches security issues before they reach production.

🚀 Why CI/CD Security Matters in 2025

The landscape of application security has dramatically shifted. Traditional security reviews at the end of development cycles are no longer sufficient. Here's why integrated security pipelines are essential:

  • Shift-Left Security: Catch vulnerabilities early when they're cheaper and easier to fix
  • Compliance Requirements: Meet evolving regulatory standards automatically
  • Supply Chain Security: Protect against dependency vulnerabilities
  • Zero-Trust Development: Assume every commit could introduce security risks

🔧 Understanding the Security Toolchain

Let's break down the core components of our security pipeline:

SAST (Static Application Security Testing)

SAST analyzes source code for potential vulnerabilities without executing the program. GitLab provides built-in SAST scanning that detects issues like SQL injection, XSS, and insecure authentication mechanisms.

DAST (Dynamic Application Security Testing)

DAST tests running applications from the outside, simulating real-world attacks. It identifies runtime vulnerabilities that SAST might miss.

Trivy Vulnerability Scanning

Trivy scans container images, file systems, and Git repositories for known vulnerabilities in dependencies and system packages.

💻 Complete GitLab CI/CD Pipeline Configuration


# .gitlab-ci.yml - Complete Security Pipeline
stages:
  - test
  - security-sast
  - security-dast
  - container-scan
  - dependency-scan
  - deploy-staging
  - security-dast-staging
  - deploy-production

variables:
  SAST_EXCLUDED_PATHS: "spec, test, tests, tmp"
  TRIVY_TIMEOUT: "10m"

# SAST Scanning
sast:
  stage: security-sast
  image: 
    name: "registry.gitlab.com/gitlab-org/security-products/sast:latest"
    entrypoint: [""]
  variables:
    SAST_EXCLUDED_PATHS: "spec, test, tests, tmp"
  artifacts:
    reports:
      sast: gl-sast-report.json
  rules:
    - if: $CI_PIPELINE_SOURCE == "merge_request_event"
    - if: $CI_COMMIT_BRANCH == $CI_DEFAULT_BRANCH

# DAST Scanning
dast:
  stage: security-dast
  image: 
    name: "registry.gitlab.com/gitlab-org/security-products/dast:latest"
    entrypoint: [""]
  variables:
    DAST_WEBSITE: "https://your-app-staging.example.com"
    DAST_AUTH_URL: "https://your-app-staging.example.com/login"
  artifacts:
    reports:
      dast: gl-dast-report.json
  rules:
    - if: $CI_COMMIT_BRANCH == $CI_DEFAULT_BRANCH

# Trivy Container Scanning
container_scanning:
  stage: container-scan
  image: 
    name: "aquasec/trivy:0.50.1"
    entrypoint: [""]
  variables:
    TRIVY_USERNAME: "$CI_REGISTRY_USER"
    TRIVY_PASSWORD: "$CI_REGISTRY_PASSWORD"
  script:
    - trivy image --exit-code 0 --format template --template "@/contrib/gitlab.tpl" --output "gl-container-scanning-report.json" $CI_REGISTRY_IMAGE:$CI_COMMIT_SHA
    - trivy image --exit-code 1 --severity HIGH,CRITICAL $CI_REGISTRY_IMAGE:$CI_COMMIT_SHA
  artifacts:
    reports:
      container_scanning: gl-container-scanning-report.json
  rules:
    - if: $CI_PIPELINE_SOURCE == "merge_request_event"
    - if: $CI_COMMIT_BRANCH == $CI_DEFAULT_BRANCH

# Dependency Scanning
dependency_scanning:
  stage: dependency-scan
  image: 
    name: "registry.gitlab.com/gitlab-org/security-products/dependency-scanning:latest"
    entrypoint: [""]
  artifacts:
    reports:
      dependency_scanning: gl-dependency-scanning-report.json
  rules:
    - if: $CI_PIPELINE_SOURCE == "merge_request_event"
    - if: $CI_COMMIT_BRANCH == $CI_DEFAULT_BRANCH

# Custom Trivy Advanced Scanning
trivy_advanced:
  stage: container-scan
  image: 
    name: "aquasec/trivy:0.50.1"
    entrypoint: [""]
  script:
    - |
      trivy config . --exit-code 0 --severity MEDIUM,HIGH,CRITICAL
      trivy filesystem . --exit-code 0 --severity HIGH,CRITICAL --skip-dirs node_modules
      trivy repo https://github.com/your-org/your-repo --exit-code 1 --severity CRITICAL
  rules:
    - if: $CI_COMMIT_BRANCH == "main" || $CI_COMMIT_BRANCH == "master"

  

⚡ Advanced Security Pipeline Configuration

For enterprise environments, consider these advanced configurations:

Custom SAST Rules

Create custom SAST rules to match your organization's security requirements:


# .gitlab-ci.yml - Custom SAST Configuration
include:
  - template: Security/SAST.gitlab-ci.yml

sast:
  variables:
    SAST_BANDIT_EXCLUDED_PATHS: "*/tests/*,*/test/*"
    SAST_BRAKEMAN_LEVEL: "1"
    SAST_FLAWFINDER_LEVEL: "3"
    SECURE_LOG_LEVEL: "debug"
  before_script:
    - echo "Starting SAST analysis for $CI_PROJECT_PATH"
  after_script:
    - |
      if [ -f "gl-sast-report.json" ]; then
        echo "SAST analysis completed. Report generated."
      fi

  

Automated Security Gates

Implement security gates to prevent vulnerable code from merging:


# Security Approval Gates
security_approval:
  stage: .pre
  image: alpine:latest
  script:
    - |
      # Check for critical vulnerabilities
      if [ -f "gl-container-scanning-report.json" ]; then
        CRITICAL_COUNT=$(jq '[.vulnerabilities[] | select(.severity == "Critical")] | length' gl-container-scanning-report.json)
        if [ "$CRITICAL_COUNT" -gt 0 ]; then
          echo "❌ Critical vulnerabilities found. Blocking merge."
          exit 1
        fi
      fi
      
      # Check SAST high severity issues
      if [ -f "gl-sast-report.json" ]; then
        HIGH_ISSUES=$(jq '.vulnerabilities | map(select(.severity == "High")) | length' gl-sast-report.json)
        if [ "$HIGH_ISSUES" -gt 3 ]; then
          echo "❌ Too many high severity issues found."
          exit 1
        fi
      fi
      echo "✅ Security checks passed"
  rules:
    - if: $CI_PIPELINE_SOURCE == "merge_request_event"

  

🔍 Integrating Trivy for Comprehensive Scanning

Trivy provides extensive vulnerability scanning capabilities. Here's how to leverage its full potential:

  • Container Image Scanning: Scan Docker images for OS package vulnerabilities
  • Filesystem Scanning: Check local directories for security issues
  • Git Repository Scanning: Scan remote repositories for secrets and vulnerabilities
  • Kubernetes Scanning: Integrate with your Kubernetes clusters

#!/bin/bash
# Advanced Trivy Scanning Script

# Scan container image with multiple output formats
trivy image --format json --output trivy-report.json your-image:latest

# Scan filesystem excluding specific directories
trivy filesystem --skip-dirs node_modules,vendor --severity HIGH,CRITICAL .

# Scan for misconfigurations in Kubernetes manifests
trivy k8s --report summary cluster

# Scan for exposed secrets in Git history
trivy repo --format table https://github.com/your-org/your-repo

# Generate SBOM (Software Bill of Materials)
trivy image --format cyclonedx your-image:latest

# Continuous monitoring with exit codes
trivy image --exit-code 1 --severity CRITICAL your-image:latest
if [ $? -eq 1 ]; then
    echo "Critical vulnerabilities found! Failing pipeline."
    exit 1
fi

  

🎯 Best Practices for Security Pipeline Implementation

  1. Start Small, Scale Gradually: Begin with basic SAST and gradually add DAST, container scanning, and dependency scanning
  2. Customize Severity Thresholds: Adjust severity levels based on your risk tolerance
  3. Implement Security Gates: Use pipeline conditions to block deployments when critical issues are found
  4. Regularly Update Scanning Tools: Keep your security scanners updated to detect the latest vulnerabilities
  5. Educate Development Teams: Provide clear remediation guidance for identified vulnerabilities

📊 Monitoring and Reporting

Effective security pipelines include comprehensive monitoring and reporting:

  • GitLab Security Dashboard: Centralized view of all security findings
  • Custom Metrics: Track vulnerability trends over time
  • Integration with External Tools: Connect with JIRA, Slack, or email notifications
  • Compliance Reporting: Generate reports for regulatory requirements

❓ Frequently Asked Questions

What's the difference between SAST and DAST?
SAST (Static Application Security Testing) analyzes source code for vulnerabilities without executing it, while DAST (Dynamic Application Security Testing) tests running applications from the outside. SAST finds coding issues early, DAST finds runtime vulnerabilities.
How does Trivy compare to other vulnerability scanners?
Trivy is known for its speed, simplicity, and comprehensive coverage. It scans containers, file systems, Git repositories, and Kubernetes configurations with a single tool, making it ideal for CI/CD pipelines compared to more specialized scanners.
Can I customize security thresholds for different environments?
Yes, you can configure different severity thresholds for development, staging, and production environments. For example, you might allow medium-severity issues in development but block deployment to production for any high or critical issues.
How do I handle false positives in security scanning?
Implement a process for triaging findings, use tool-specific configuration to exclude known false positives, and gradually tune your rulesets. GitLab allows you to dismiss specific findings and create custom rules.
What's the performance impact of adding security scanning to CI/CD?
Modern security tools are optimized for CI/CD environments. Use parallel execution, caching, and selective scanning (only changed files) to minimize impact. Most pipelines see less than 10% increase in total runtime with proper optimization.

💬 Found this article helpful? Have questions about implementing security in your CI/CD pipeline? Please leave a comment below or share it with your network to help others learn about DevSecOps best practices!

About LK-TECH Academy — Practical tutorials & explainers on software engineering, AI, and infrastructure. Follow for concise, hands-on guides.

Monday, 20 October 2025

Mastering Pod Security Contexts and OPA Gatekeeper for Kubernetes Security 2025

October 20, 2025 0

Mastering Pod Security Contexts and OPA Gatekeeper for Kubernetes Security

Kubernetes Pod Security Context and OPA Gatekeeper security implementation diagram showing container isolation, policy enforcement, and security layers for enterprise Kubernetes clusters

In today's cloud-native landscape, Kubernetes security has become paramount as organizations scale their containerized applications. With the rise of sophisticated cyber threats targeting container environments, understanding and implementing robust security measures is no longer optional—it's essential. This comprehensive guide dives deep into two critical Kubernetes security components: Pod Security Contexts and OPA Gatekeeper. Whether you're a DevOps engineer, platform architect, or security specialist, mastering these tools will transform your Kubernetes security posture from vulnerable to enterprise-ready.

🚀 Understanding Pod Security Contexts: The Foundation of Container Security

Pod Security Contexts define privilege and access control settings for pods and containers. They're your first line of defense against container escape attacks and privilege escalation. Let's break down the key components:

  • RunAsUser/RunAsGroup: Controls which user and group IDs containers run as
  • FSGroup: Defines the special supplemental group for volume ownership
  • RunAsNonRoot: Ensures containers don't run as root user
  • AllowPrivilegeEscalation: Prevents child processes from gaining more privileges
  • Capabilities: Manages Linux capabilities granted to containers
  • Seccomp/SELinux: Advanced security profiles and context types

💻 Secure Pod Security Context Configuration


apiVersion: v1
kind: Pod
metadata:
  name: secure-app-pod
spec:
  securityContext:
    runAsNonRoot: true
    runAsUser: 1000
    runAsGroup: 3000
    fsGroup: 2000
    seccompProfile:
      type: RuntimeDefault
  containers:
  - name: secure-app
    image: nginx:1.25
    securityContext:
      allowPrivilegeEscalation: false
      capabilities:
        drop:
        - ALL
        add:
        - NET_BIND_SERVICE
      readOnlyRootFilesystem: true
    volumeMounts:
    - name: tmp-volume
      mountPath: /tmp
  volumes:
  - name: tmp-volume
    emptyDir: {}

  

🔒 Advanced Security Context Patterns

For enterprise-grade security, consider these advanced patterns that go beyond basic configurations:

  • AppArmor Profiles: Application-level access control policies
  • Seccomp Custom Profiles: Fine-grained system call filtering
  • Pod Security Standards: Implementing baseline and restricted policies
  • Service Account Token Projection: Secure service account token management

💻 Advanced Seccomp Profile Implementation


# custom-seccomp-profile.yaml
apiVersion: v1
kind: SeccompProfile
metadata:
  name: custom-restricted
annotations:
  seccomp.security.alpha.kubernetes.io/allowedProfileNames: custom-restricted
spec:
  defaultAction: SCMP_ACT_ERRNO
  architectures:
  - SCMP_ARCH_X86_64
  - SCMP_ARCH_X86
  - SCMP_ARCH_X32
  syscalls:
  - names:
    - accept
    - access
    - arch_prctl
    - bind
    - brk
    # ... additional allowed syscalls
    action: SCMP_ACT_ALLOW

# Pod using custom seccomp profile
apiVersion: v1
kind: Pod
metadata:
  name: seccomp-demo
spec:
  securityContext:
    seccompProfile:
      type: Localhost
      localhostProfile: profiles/custom-restricted.yaml
  containers:
  - name: test-container
    image: nginx:1.25
    securityContext:
      allowPrivilegeEscalation: false
      capabilities:
        drop: ["ALL"]

  

🚀 Introduction to OPA Gatekeeper: Policy-as-Code for Kubernetes

OPA (Open Policy Agent) Gatekeeper brings policy-as-code to Kubernetes, enabling you to define, enforce, and audit policies across your cluster. Unlike traditional admission controllers, Gatekeeper provides:

  • Declarative Policy Language: Use Rego for complex policy logic
  • Audit Capabilities: Continuous compliance monitoring
  • Dry-run Mode: Test policies before enforcement
  • Custom Resources: Native Kubernetes API for policies
  • Mutation Support: Automatically fix policy violations

💻 Installing OPA Gatekeeper


# Install latest Gatekeeper version
kubectl apply -f https://raw.githubusercontent.com/open-policy-agent/gatekeeper/master/deploy/gatekeeper.yaml

# Verify installation
kubectl get pods -n gatekeeper-system

# Check webhook configuration
kubectl get validatingwebhookconfigurations gatekeeper-validating-webhook-configuration

# Install mutation webhook (optional)
kubectl apply -f https://raw.githubusercontent.com/open-policy-agent/gatekeeper/master/deploy/gatekeeper-mutation.yaml

  

🔐 Creating Custom Constraints with Rego

Rego is OPA's purpose-built policy language that enables sophisticated policy decisions. Let's create policies that enforce security best practices:

💻 Require Non-Root User Policy


# ConstraintTemplate
apiVersion: templates.gatekeeper.sh/v1beta1
kind: ConstraintTemplate
metadata:
  name: k8srequiredprobes
spec:
  crd:
    spec:
      names:
        kind: K8sRequiredProbes
      validation:
        openAPIV3Schema:
          type: object
          properties:
            probes:
              type: array
              items:
                type: string
  targets:
    - target: admission.k8s.gatekeeper.sh
      rego: |
        package k8srequiredprobes

        violation[{"msg": msg}] {
            container := input.review.object.spec.containers[_]
            expected_probes := input.parameters.probes
            missing_probes := expected_probes - get_probes(container)
            count(missing_probes) > 0
            msg := sprintf("Container %v is missing required probes: %v", [container.name, missing_probes])
        }

        get_probes(container) = probes {
            probes := [p | p := container.livenessProbe; p != null]
            probes := probes + [p | p := container.readinessProbe; p != null]
            probes := probes + [p | p := container.startupProbe; p != null]
        }

# Constraint Instance
apiVersion: constraints.gatekeeper.sh/v1beta1
kind: K8sRequiredProbes
metadata:
  name: require-liveness-readiness
spec:
  match:
    kinds:
    - apiGroups: [""]
      kinds: ["Pod"]
  parameters:
    probes: ["livenessProbe", "readinessProbe"]

  

⚡ Advanced Gatekeeper Policies for Security

Let's implement comprehensive security policies that cover multiple aspects of Kubernetes security:

💻 Comprehensive Security Policy Suite


# Block privileged containers
apiVersion: constraints.gatekeeper.sh/v1beta1
kind: K8sPSPPrivilegedContainer
metadata:
  name: psp-privileged-container
spec:
  match:
    kinds:
    - apiGroups: [""]
      kinds: ["Pod"]
  parameters:
    privileged: false

# Require specific security contexts
apiVersion: constraints.gatekeeper.sh/v1beta1
kind: K8sPSPSecurityContext
metadata:
  name: require-security-context
spec:
  match:
    kinds:
    - apiGroups: [""]
      kinds: ["Pod"]
  parameters:
    runAsNonRoot: true
    runAsUser:
      min: 1000
      max: 65535
    allowPrivilegeEscalation: false

# Block host namespace sharing
apiVersion: constraints.gatekeeper.sh/v1beta1
kind: K8sPSPHostNamespace
metadata:
  name: block-host-namespace
spec:
  match:
    kinds:
    - apiGroups: [""]
      kinds: ["Pod"]
  parameters:
    hostPID: false
    hostIPC: false
    hostNetwork: false

# Image registry whitelist
apiVersion: constraints.gatekeeper.sh/v1beta1
kind: K8sAllowedRepos
metadata:
  name: allowed-repositories
spec:
  match:
    kinds:
    - apiGroups: [""]
      kinds: ["Pod"]
  parameters:
    repos:
    - "docker.io/library/"
    - "gcr.io/my-project/"
    - "registry.k8s.io/"

  

🔍 Monitoring and Auditing with Gatekeeper

Gatekeeper's audit functionality provides continuous compliance monitoring. Here's how to leverage it effectively:

  • Constraint Status: Monitor policy violations across the cluster
  • Audit Results: Historical data on policy compliance
  • Metrics Integration: Export metrics to Prometheus
  • Alerting: Set up alerts for critical violations

💻 Audit Configuration and Monitoring


# Check constraint status
kubectl get constraints

# View detailed constraint violations
kubectl describe K8sPSPPrivilegedContainer psp-privileged-container

# Get audit results
kubectl get constrainttemplates -o yaml

# Set up audit frequency (in Gatekeeper deployment)
kubectl patch deployment gatekeeper-controller-manager \
  -n gatekeeper-system \
  --type='json' \
  -p='[{"op": "replace", "path": "/spec/template/spec/containers/0/args", "value": ["--audit-interval=60", "--log-level=INFO", "--operation=webhook"]}]'

# Export metrics to Prometheus
kubectl port-forward -n gatekeeper-system deployment/gatekeeper-controller-manager 8888:8888
curl localhost:8888/metrics

  

🛠️ Real-World Implementation Strategy

Implementing these security measures requires a phased approach to avoid breaking existing applications:

  1. Assessment Phase: Audit current pod security contexts and identify gaps
  2. Policy Development: Create Gatekeeper policies in dry-run mode
  3. Testing: Deploy policies to non-production environments
  4. Enforcement: Gradually enable enforcement with proper monitoring
  5. Optimization: Continuously refine policies based on audit results

💻 Gradual Policy Enforcement Strategy


# Phase 1: Dry-run mode
apiVersion: constraints.gatekeeper.sh/v1beta1
kind: K8sPSPPrivilegedContainer
metadata:
  name: psp-privileged-container-dry-run
  annotations:
    mode.gatekeeper.sh: dry-run
spec:
  match:
    kinds:
    - apiGroups: [""]
      kinds: ["Pod"]
  parameters:
    privileged: false

# Phase 2: Warn mode (after 2 weeks of dry-run)
apiVersion: constraints.gatekeeper.sh/v1beta1
kind: K8sPSPPrivilegedContainer
metadata:
  name: psp-privileged-container-warn
  annotations:
    mode.gatekeeper.sh: warn
spec:
  match:
    kinds:
    - apiGroups: [""]
      kinds: ["Pod"]
  parameters:
    privileged: false

# Phase 3: Enforcement (after addressing violations)
apiVersion: constraints.gatekeeper.sh/v1beta1
kind: K8sPSPPrivilegedContainer
metadata:
  name: psp-privileged-container-enforce
spec:
  match:
    kinds:
    - apiGroups: [""]
      kinds: ["Pod"]
  parameters:
    privileged: false

  

⚡ Key Takeaways

  1. Pod Security Contexts provide fundamental container isolation and privilege control
  2. OPA Gatekeeper enables policy-as-code with comprehensive audit capabilities
  3. Implement security policies gradually using dry-run and warn modes
  4. Combine multiple security layers for defense-in-depth approach
  5. Continuous monitoring and auditing are essential for maintaining security posture

❓ Frequently Asked Questions

What's the difference between Pod Security Context and Pod Security Standards?
Pod Security Context is a Kubernetes native specification that defines security settings for individual pods, while Pod Security Standards are policy frameworks that define baseline, restricted, and privileged security levels. OPA Gatekeeper can enforce these standards across your cluster.
Can OPA Gatekeeper replace Kubernetes Pod Security Policies?
Yes, OPA Gatekeeper is the recommended replacement for the deprecated Pod Security Policies (PSP). It provides more flexibility, better audit capabilities, and supports policy-as-code through Rego language.
How do I handle legacy applications that require privileged access?
Use Gatekeeper's exemption features to create namespaces or labels that bypass certain policies for specific applications. Gradually refactor these applications to remove privileged requirements while maintaining business continuity.
What performance impact does OPA Gatekeeper have on cluster operations?
Gatekeeper adds minimal latency (typically 10-50ms) to admission requests. The impact depends on policy complexity and cluster size. Use constraint templates efficiently and avoid overly complex Rego policies for optimal performance.
How can I test Gatekeeper policies before applying them to production?
Use the dry-run mode to test policies without enforcement, set up a dedicated testing cluster, or use tools like Conftest to test policies locally against your Kubernetes manifests before deployment.

💬 Found this article helpful? Please leave a comment below or share it with your network to help others learn! Have you implemented Pod Security Contexts or OPA Gatekeeper in your environment? Share your experiences and challenges!

About LK-TECH Academy — Practical tutorials & explainers on software engineering, AI, and infrastructure. Follow for concise, hands-on guides.

Saturday, 28 November 2020

Spring Boot for Beginners

November 28, 2020 0
  
spring boot for beginners example,spring initializr,spring tutorial,spring boot application,spring boot example,spring boot interview questions,spring boot initializr,java spring boot

What is Spring Boot

Spring boot build on top of the Spring framework. There is no requirement on having lot of configurations when you use Spring Boot. Its use It uses convention over configuration software design paradigm. Therefore, it reduces lot of effort of developers.

What you need in your computer

  • Java 1.8
  • Maven 3.0+
  • Spring Framework 5.0.0.BUILD-SNAPSHOT
  • An IDE (Spring Tool Suite) is recommended.

Why you choose spring Boot as your development framework.

  1. Spring Boot is a framework which provide default configurations and annotation that you can create project simply.
  2. Reduce development time and increase the productivity.
  3. Very easy to integrate with Spring JDBC, Spring ORM, Spring Data, Spring Security etc.
  4. It provides Embedded HTTP servers like Tomcat, Jetty etc. to develop and test our web applications very easily.
  5. Its provide lot of plugins to implement various features.

 

Spring Boot Features

  • Web Development

We can easily create web html application with embed servers like tomcat and jetty. We can use the spring-boot-starter-web module to start and run the application quickly.

  • SpringApplication

It is a class which help to bootstrap the spring applications

public static void main(String[] args)
{
       SpringApplication.run(ClassName.class, args);
}
   
  • Application events and listeners

Spring Boot uses events to handle the variety of tasks. It allows us to create factories file that is used to add listeners

  • Admin features

By using spring.application.admin.enabled property you can enable admin features.

  • Externalized Configuration

The application uses YAML files to externalize configuration. With this feature we can support our app to run in multiple different environments.

  • Properties Files

Springboot user application property file where we can define server port and any other properties that you can change externally

  • YAML Support

It is an alternative for the property file and spring boot application support it by default.

  • Logging

It is providing common logging for all the internal login.

  • Security
Spring Boot has separate security framework which you can use to authenticate and authorize users.
Spring Boot security framework




Search:spring boot for beginners example,spring initializr,spring tutorial,spring boot application,spring boot example,spring boot interview questions,spring boot initializr,java spring boot