Index: backend/pom.xml
===================================================================
--- backend/pom.xml	(revision fb07bff097454b819b9e2bf33c8bbda3c28e04fe)
+++ backend/pom.xml	(revision 1e0b607adb048696341c427afaf049477c83ea9c)
@@ -95,4 +95,23 @@
         </dependency>
 
+<!--        JWT Dependencies: -->
+        <dependency>
+            <groupId>io.jsonwebtoken</groupId>
+            <artifactId>jjwt-api</artifactId>
+            <version>0.11.5</version>
+        </dependency>
+        <dependency>
+            <groupId>io.jsonwebtoken</groupId>
+            <artifactId>jjwt-impl</artifactId>
+            <version>0.11.5</version>
+            <scope>runtime</scope>
+        </dependency>
+        <dependency>
+            <groupId>io.jsonwebtoken</groupId>
+            <artifactId>jjwt-jackson</artifactId>
+            <version>0.11.5</version>
+            <scope>runtime</scope>
+        </dependency>
+
     </dependencies>
 
Index: backend/src/main/java/mk/ukim/finki/db/distributorapp/_security/SecurityConfig.java
===================================================================
--- backend/src/main/java/mk/ukim/finki/db/distributorapp/_security/SecurityConfig.java	(revision fb07bff097454b819b9e2bf33c8bbda3c28e04fe)
+++ backend/src/main/java/mk/ukim/finki/db/distributorapp/_security/SecurityConfig.java	(revision 1e0b607adb048696341c427afaf049477c83ea9c)
@@ -2,4 +2,6 @@
 
 import lombok.RequiredArgsConstructor;
+import mk.ukim.finki.db.distributorapp._security.jwt.JwtAuthenticationFilter;
+import mk.ukim.finki.db.distributorapp._security.jwt.JwtTokenProvider;
 import org.springframework.context.annotation.Bean;
 import org.springframework.context.annotation.Configuration;
@@ -16,4 +18,5 @@
 import org.springframework.security.provisioning.InMemoryUserDetailsManager;
 import org.springframework.security.web.SecurityFilterChain;
+import org.springframework.security.web.authentication.UsernamePasswordAuthenticationFilter;
 import org.springframework.web.cors.CorsConfiguration;
 import org.springframework.web.cors.CorsConfigurationSource;
@@ -29,4 +32,5 @@
     private final CustomUsernamePasswordAuthenticationProvider authenticationProvider;
     private final SuperUserAuthenticationProvider superUserAuthenticationProvider;
+    private final JwtTokenProvider jwtTokenProvider;
 
     @Bean
@@ -47,4 +51,5 @@
                         .authenticated()
                 )
+                .addFilterBefore(new JwtAuthenticationFilter(jwtTokenProvider), UsernamePasswordAuthenticationFilter.class)
                 .formLogin(login -> login
                         .loginPage("/auth/login")
Index: backend/src/main/java/mk/ukim/finki/db/distributorapp/_security/auth/RestAuthController.java
===================================================================
--- backend/src/main/java/mk/ukim/finki/db/distributorapp/_security/auth/RestAuthController.java	(revision 1e0b607adb048696341c427afaf049477c83ea9c)
+++ backend/src/main/java/mk/ukim/finki/db/distributorapp/_security/auth/RestAuthController.java	(revision 1e0b607adb048696341c427afaf049477c83ea9c)
@@ -0,0 +1,60 @@
+package mk.ukim.finki.db.distributorapp._security.auth;
+
+import lombok.AllArgsConstructor;
+import lombok.Getter;
+import lombok.RequiredArgsConstructor;
+import lombok.Setter;
+import mk.ukim.finki.db.distributorapp._security.jwt.JwtTokenProvider;
+import org.springframework.http.ResponseEntity;
+import org.springframework.security.authentication.AuthenticationManager;
+import org.springframework.security.authentication.UsernamePasswordAuthenticationToken;
+import org.springframework.security.core.AuthenticationException;
+import org.springframework.security.core.GrantedAuthority;
+import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.RequestBody;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+
+import java.util.List;
+
+@RestController
+@RequiredArgsConstructor
+@RequestMapping("/api/auth")
+public class RestAuthController {
+    private final AuthService authService;
+    private final JwtTokenProvider jwtTokenProvider;
+    private final AuthenticationManager authenticationManager;
+
+    @PostMapping("/login")
+    public ResponseEntity<?> login(@RequestBody AuthRequest request){
+        try{
+            var authentication = authenticationManager.authenticate(
+                    new UsernamePasswordAuthenticationToken(request.getEmail(), request.getPassword())
+            );
+            String email = authentication.getName();
+            List<String> roles = authentication.getAuthorities()
+                    .stream()
+                    .map(GrantedAuthority::getAuthority)
+                    .toList();
+            String token = jwtTokenProvider.createToken(email,roles);
+            return ResponseEntity.ok(new AuthResponse(token));
+        }catch (AuthenticationException e){
+            return ResponseEntity.status(404).body("Invalid email/password supplied");
+        }
+    }
+}
+
+@Getter
+@Setter
+class AuthRequest {
+    private String email;
+    private String password;
+}
+
+@Getter
+@Setter
+@AllArgsConstructor
+class AuthResponse {
+    private String token;
+
+}
Index: backend/src/main/java/mk/ukim/finki/db/distributorapp/_security/jwt/JwtAuthenticationFilter.java
===================================================================
--- backend/src/main/java/mk/ukim/finki/db/distributorapp/_security/jwt/JwtAuthenticationFilter.java	(revision 1e0b607adb048696341c427afaf049477c83ea9c)
+++ backend/src/main/java/mk/ukim/finki/db/distributorapp/_security/jwt/JwtAuthenticationFilter.java	(revision 1e0b607adb048696341c427afaf049477c83ea9c)
@@ -0,0 +1,48 @@
+package mk.ukim.finki.db.distributorapp._security.jwt;
+
+import jakarta.servlet.FilterChain;
+import jakarta.servlet.ServletException;
+import jakarta.servlet.http.HttpServletRequest;
+import jakarta.servlet.http.HttpServletResponse;
+import lombok.RequiredArgsConstructor;
+import org.springframework.security.authentication.UsernamePasswordAuthenticationToken;
+import org.springframework.security.core.context.SecurityContextHolder;
+import org.springframework.security.web.authentication.WebAuthenticationDetailsSource;
+import org.springframework.util.StringUtils;
+import org.springframework.web.filter.OncePerRequestFilter;
+
+import java.io.IOException;
+import java.util.Collections;
+
+@RequiredArgsConstructor
+public class JwtAuthenticationFilter extends OncePerRequestFilter {
+
+    private final JwtTokenProvider jwtTokenProvider;
+
+    @Override
+    protected void doFilterInternal(HttpServletRequest request,
+                                    HttpServletResponse response,
+                                    FilterChain filterChain) throws ServletException, IOException {
+
+        String token = resolveToken(request);
+        if(token!=null && jwtTokenProvider.validateToken(token)){
+            String email = jwtTokenProvider.getEmailFromToken(token);
+
+            UsernamePasswordAuthenticationToken auth = new UsernamePasswordAuthenticationToken(
+                    email, null, Collections.emptyList());
+            auth.setDetails(new WebAuthenticationDetailsSource().buildDetails(request));
+
+            SecurityContextHolder.getContext().setAuthentication(auth);
+        }
+
+        filterChain.doFilter(request, response);
+    }
+
+    private String resolveToken(HttpServletRequest request) {
+        String bearerToken = request.getHeader("Authorization");
+        if (StringUtils.hasText(bearerToken) && bearerToken.startsWith("Bearer ")) {
+            return bearerToken.substring(7);
+        }
+        return null;
+    }
+}
Index: backend/src/main/java/mk/ukim/finki/db/distributorapp/_security/jwt/JwtTokenProvider.java
===================================================================
--- backend/src/main/java/mk/ukim/finki/db/distributorapp/_security/jwt/JwtTokenProvider.java	(revision 1e0b607adb048696341c427afaf049477c83ea9c)
+++ backend/src/main/java/mk/ukim/finki/db/distributorapp/_security/jwt/JwtTokenProvider.java	(revision 1e0b607adb048696341c427afaf049477c83ea9c)
@@ -0,0 +1,72 @@
+package mk.ukim.finki.db.distributorapp._security.jwt;
+
+import io.jsonwebtoken.*;
+import io.jsonwebtoken.security.Keys;
+import jakarta.annotation.PostConstruct;
+import org.springframework.beans.factory.annotation.Value;
+import org.springframework.stereotype.Component;
+
+import java.security.Key;
+import java.util.Date;
+import java.util.List;
+
+@Component
+public class JwtTokenProvider {
+
+    @Value("${jwt.secret}")
+    private String secret;
+
+    @Value("${jwt.validity}")
+    private long validityInMilliseconds;
+
+    private Key secretKey;
+
+    @PostConstruct
+    protected void init() {
+        secretKey = Keys.hmacShaKeyFor(secret.getBytes());
+    }
+
+    public String createToken(String email, List<String> roles) {
+        Claims claims = Jwts.claims().setSubject(email);
+        claims.put("roles", roles);
+        Date now = new Date();
+        Date validity = new Date(now.getTime() + validityInMilliseconds);
+
+        return Jwts.builder()
+                .setClaims(claims)
+                .setIssuedAt(now)
+                .setExpiration(validity)
+                .signWith(secretKey, SignatureAlgorithm.HS256)
+                .compact();
+    }
+
+    public boolean validateToken(String token) {
+        try {
+            Jws<Claims> claims = Jwts.parserBuilder()
+                    .setSigningKey(secretKey)
+                    .build()
+                    .parseClaimsJws(token);
+            return !claims.getBody().getExpiration().before(new Date());
+        } catch (JwtException | IllegalArgumentException e) {
+            return false;
+        }
+    }
+
+    public String getEmailFromToken(String token) {
+        return Jwts.parserBuilder()
+                .setSigningKey(secretKey)
+                .build()
+                .parseClaimsJws(token)
+                .getBody()
+                .getSubject();
+    }
+
+    public List<String> getRolesFromToken(String token) {
+        Claims claims = Jwts.parserBuilder()
+                .setSigningKey(secretKey)
+                .build()
+                .parseClaimsJws(token)
+                .getBody();
+        return (List<String>) claims.get("roles");
+    }
+}
Index: backend/src/main/resources/application-prod.properties
===================================================================
--- backend/src/main/resources/application-prod.properties	(revision fb07bff097454b819b9e2bf33c8bbda3c28e04fe)
+++ backend/src/main/resources/application-prod.properties	(revision 1e0b607adb048696341c427afaf049477c83ea9c)
@@ -27,14 +27,7 @@
 server.ssl.enabled=true
 
-## -------------------OAuth 2 Configuration-------------------
-spring.security.oauth2.client.registration.google.client-id=YOUR_GOOGLE_CLIENT_ID
-spring.security.oauth2.client.registration.google.client-secret=YOUR_GOOGLE_CLIENT_SECRET
-spring.security.oauth2.client.registration.google.scope=openid,profile,email
-spring.security.oauth2.client.registration.google.redirect-uri={baseUrl}/login/oauth2/code/{registrationId}
-
-spring.security.oauth2.client.provider.google.authorization-uri=https://accounts.google.com/o/oauth2/v2/auth
-spring.security.oauth2.client.provider.google.token-uri=https://www.googleapis.com/oauth2/v4/token
-spring.security.oauth2.client.provider.google.user-info-uri=https://www.googleapis.com/oauth2/v3/userinfo
-spring.security.oauth2.client.provider.google.user-name-attribute=sub
+## -------------------JWT Configuration-------------------
+jwt.secret=${JWT_SECRET}
+jwt.validity=3600000
 
 ## -------------------Email properties-------------------
Index: ckend/src/test/java/mk/ukim/finki/db/distributorapp/ApiEndpointsTest.java
===================================================================
--- backend/src/test/java/mk/ukim/finki/db/distributorapp/ApiEndpointsTest.java	(revision fb07bff097454b819b9e2bf33c8bbda3c28e04fe)
+++ 	(revision )
@@ -1,67 +1,0 @@
-package mk.ukim.finki.db.distributorapp;
-
-import org.junit.jupiter.api.Test;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.boot.test.autoconfigure.web.servlet.AutoConfigureMockMvc;
-import org.springframework.boot.test.context.SpringBootTest;
-import org.springframework.test.web.servlet.MockMvc;
-
-import java.util.List;
-
-import static org.junit.jupiter.api.Assertions.assertTrue;
-import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.get;
-import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status;
-
-@SpringBootTest
-@AutoConfigureMockMvc
-public class ApiEndpointsTest {
-
-    @Autowired
-    private MockMvc mockMvc;
-
-    @Test
-    public void testAllEndpoints() throws Exception {
-        List<String> urls = List.of(
-                "/article/all",
-                "/articleUnit/all",
-                "/category/all",
-                "/city/all",
-                "/customer/all",
-                "/delivery/all",
-                "/dStatus/all",
-                "/driver/all",
-                "/manager/all",
-                "/manufacturer/all",
-                "/order/all",
-                "/oStatus/all",
-                "/price/all",
-                "/pForma/all",
-                "/pfStatus/all",
-                "/region/all",
-                "/users/all",
-                "/vehicle/all",
-                "/warehouse/all",
-                "/weekday/all"
-        );
-
-        StringBuilder summary = new StringBuilder();
-        boolean allTestsPassed = true;
-
-        for (String url : urls) {
-            try {
-                mockMvc.perform(get(url))
-                        .andExpect(status().isOk());
-                summary.append("SUCCESS: ").append(url)
-                        .append("\n");
-            } catch (Exception e) {
-                allTestsPassed = false;
-                summary.append("FAILED: ").append(url)
-                        .append(" - ").append(e.getMessage())
-                        .append("\n");
-            }
-        }
-
-        System.out.println("\nTest Summary:\n"+summary);
-        assertTrue(allTestsPassed,"Some endpoints failed. Check the summary for details.");
-    }
-}
Index: ckend/src/test/java/mk/ukim/finki/db/distributorapp/ControllerIntegrationTest.java
===================================================================
--- backend/src/test/java/mk/ukim/finki/db/distributorapp/ControllerIntegrationTest.java	(revision fb07bff097454b819b9e2bf33c8bbda3c28e04fe)
+++ 	(revision )
@@ -1,62 +1,0 @@
-package mk.ukim.finki.db.distributorapp;
-import org.junit.jupiter.api.Test;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.boot.test.context.SpringBootTest;
-import org.springframework.http.ResponseEntity;
-import org.springframework.web.client.RestTemplate;
-
-import java.util.List;
-
-import static org.junit.jupiter.api.Assertions.*;
-
-@SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT)
-public class ControllerIntegrationTest {
-
-    @Autowired
-    private RestTemplate restTemplate;
-
-    // List of controller mappings
-    private final List<String> controllerMappings = List.of(
-            "article",
-            "articleUnit",
-            "category",
-            "city",
-            "customer",
-            "delivery",
-            "dStatus",
-            "driver",
-            "manager",
-            "manufacturer",
-            "order",
-            "oStatus",
-            "price",
-            "pForma",
-            "pfStatus",
-            "region",
-            "users",
-            "vehicle",
-            "warehouse",
-            "weekday"
-            // Add more mappings as needed
-    );
-
-    @Test
-    void testGetAllEndpoints() {
-        controllerMappings.forEach(mapping -> {
-            String url = "http://localhost:8080/" + mapping + "/all";
-            System.out.println("Testing endpoint: " + url);
-
-            ResponseEntity<Object[]> response = restTemplate.getForEntity(url, Object[].class);
-
-            // Check the status code
-            assertEquals(200, response.getStatusCodeValue(), "Unexpected status code for " + url);
-
-            // Check the response body
-            Object[] body = response.getBody();
-            assertNotNull(body, "Response body is null for " + url);
-            assertTrue(true, "Response body is not an array or has invalid size for " + url);
-
-            System.out.println("✅ Successfully tested: " + url + " with " + body.length + " items.");
-        });
-    }
-}
Index: ckend/src/test/java/mk/ukim/finki/db/distributorapp/DistributorAppApplicationTests.java
===================================================================
--- backend/src/test/java/mk/ukim/finki/db/distributorapp/DistributorAppApplicationTests.java	(revision fb07bff097454b819b9e2bf33c8bbda3c28e04fe)
+++ 	(revision )
@@ -1,13 +1,0 @@
-package mk.ukim.finki.db.distributorapp;
-
-import org.junit.jupiter.api.Test;
-import org.springframework.boot.test.context.SpringBootTest;
-
-@SpringBootTest
-class DistributorAppApplicationTests {
-
-    @Test
-    void contextLoads() {
-    }
-
-}
Index: ckend/src/test/java/mk/ukim/finki/db/distributorapp/RestArticleControllerIntegrationTest.java
===================================================================
--- backend/src/test/java/mk/ukim/finki/db/distributorapp/RestArticleControllerIntegrationTest.java	(revision fb07bff097454b819b9e2bf33c8bbda3c28e04fe)
+++ 	(revision )
@@ -1,91 +1,0 @@
-package mk.ukim.finki.db.distributorapp;
-
-import org.junit.jupiter.api.Test;
-import org.junit.platform.commons.logging.Logger;
-import org.junit.platform.commons.logging.LoggerFactory;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.boot.test.autoconfigure.web.servlet.AutoConfigureMockMvc;
-import org.springframework.boot.test.context.SpringBootTest;
-import org.springframework.http.MediaType;
-import org.springframework.test.web.servlet.MockMvc;
-import org.springframework.web.client.RestTemplate;
-
-import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.*;
-import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.jsonPath;
-import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status;
-
-@SpringBootTest
-@AutoConfigureMockMvc
-public class RestArticleControllerIntegrationTest {
-
-    private static final Logger logger = LoggerFactory.getLogger(RestArticleControllerIntegrationTest.class);
-
-    @Autowired
-    private RestTemplate restTemplate;
-
-    @Autowired
-    private MockMvc mockMvc;
-
-//    @Test
-//    void testGetAllArticles() {
-//        logger.info();
-//    }
-
-    @Test
-    public void testAddEditDeleteArticle() throws Exception {
-        String newArticle = """
-                {
-                    "id": null,
-                    "name": "Test Article",
-                    "manufacturer": "Test Manufacturer",
-                    "manufacturerId": 1,
-                    "price": 99.99,
-                    "category": "Test Category",
-                    "categoryId": 1,
-                    "weight": 10,
-                    "image": "test_image.jpg"
-                }
-                """;
-
-        String response = mockMvc.perform(put("/article/add")
-                        .contentType(MediaType.APPLICATION_JSON)
-                        .content(newArticle))
-                .andExpect(status().isOk())
-                .andExpect(jsonPath("$.id").exists())
-                .andReturn()
-                .getResponse()
-                .getContentAsString();
-
-        Long articleId = extractIdFromResponse(response);
-
-        String updatedArticle = """
-                {
-                    "id": %d,
-                    "name": "Updated Test Article",
-                    "manufacturer": "Test Manufacturer",
-                    "manufacturerId": 1,
-                    "price": 199.99,
-                    "category": "Test Category",
-                    "categoryId": 1,
-                    "weight": 15,
-                    "image": "updated_image.jpg"
-                }
-                """.formatted(articleId);
-
-        mockMvc.perform(put("/article/edit")
-                .contentType(MediaType.APPLICATION_JSON)
-                .content(updatedArticle))
-                .andExpect(status().isOk())
-                .andExpect(jsonPath("$.name").value("Updated Test Article"));
-
-        mockMvc.perform(delete("/article/delete/"+articleId))
-                .andExpect(status().isOk());
-
-        mockMvc.perform(get("/article/"+articleId))
-                .andExpect(status().isNotFound());
-    }
-
-    private Long extractIdFromResponse(String response) {
-        return Long.valueOf(response.replaceAll("[^0-9]",""));
-    }
-}
Index: ckend/src/test/java/mk/ukim/finki/db/distributorapp/config/TestConfig.java
===================================================================
--- backend/src/test/java/mk/ukim/finki/db/distributorapp/config/TestConfig.java	(revision fb07bff097454b819b9e2bf33c8bbda3c28e04fe)
+++ 	(revision )
@@ -1,14 +1,0 @@
-package mk.ukim.finki.db.distributorapp.config;
-
-import org.springframework.context.annotation.Bean;
-import org.springframework.context.annotation.Configuration;
-import org.springframework.web.client.RestTemplate;
-
-@Configuration
-public class TestConfig {
-
-    @Bean
-    public RestTemplate restTemplate() {
-        return new RestTemplate();
-    }
-}
