Index: docs/test-data.sql
===================================================================
--- docs/test-data.sql	(revision 2d3f3a31f600db46ca1196dd4f75fe4c39e3b6bf)
+++ docs/test-data.sql	(revision f1c6a71836c516581ea70db523a7a6cb9bd77e78)
@@ -1,9 +1,9 @@
 INSERT INTO users (username, is_activate, password, description, registered_at, sex)
 VALUES
-    ('user1', true, 'password1', 'First user', NOW(), 'M'),
-    ('user2', true, 'password2', 'Second user', NOW(), 'F'),
-    ('user3', true, 'password3', 'Third user', NOW(), 'M'),
-    ('user4', true, 'password4', 'Fourth user', NOW(), 'F'),
-    ('user5', true, 'password5', 'Fifth user', NOW(), 'M');
+    ('user1', true, '$2a$12$0f.x7aBM2wFBZBXoLPj0BObVsk.J1kXFYo5nb4niAWkI4hk5tHvDy', 'First user', NOW(), 'M'),
+    ('user2', true, '$2a$12$VkR0a47LDVM6aUqFcEJGSu9jhZCz.05tCoyiRicFObt4f2x2gijKa', 'Second user', NOW(), 'F'),
+    ('user3', true, '$2a$12$eSLdHHJ1KFgv.dOupmloXeItjrt2o1IB6ER6Nq7WYj9Jfr2bEwK2a', 'Third user', NOW(), 'M'),
+    ('user4', true, '$2a$12$dF5SXcNhMulgU3Qre3nh1e.aatRiJZsnfoBSqReGnXe9rIbHYVWhe', 'Fourth user', NOW(), 'F'),
+    ('user5', true, '$2a$12$zHrloz8WG2zo5S6MTf1C0ez1raMlmDJdB8OOa2I1S2pVy9oI76YTa', 'Fifth user', NOW(), 'M');
 
 INSERT INTO thread (content, user_id)
Index: pom.xml
===================================================================
--- pom.xml	(revision 2d3f3a31f600db46ca1196dd4f75fe4c39e3b6bf)
+++ pom.xml	(revision f1c6a71836c516581ea70db523a7a6cb9bd77e78)
@@ -20,4 +20,17 @@
             <artifactId>spring-boot-starter-thymeleaf</artifactId>
         </dependency>
+        <!-- https://mvnrepository.com/artifact/org.springframework.security/spring-security-core -->
+<!--        <dependency>-->
+<!--            <groupId>org.springframework.security</groupId>-->
+<!--            <artifactId>spring-security-core</artifactId>-->
+<!--            <version>6.4.1</version>-->
+<!--        </dependency>-->
+
+        <dependency>
+            <groupId>org.springframework.boot</groupId>
+            <artifactId>spring-boot-starter-security</artifactId>
+        </dependency>
+
+
         <dependency>
             <groupId>org.springframework.boot</groupId>
Index: src/main/java/com/db/finki/www/build_board/DemoApplication.java
===================================================================
--- src/main/java/com/db/finki/www/build_board/DemoApplication.java	(revision 2d3f3a31f600db46ca1196dd4f75fe4c39e3b6bf)
+++ src/main/java/com/db/finki/www/build_board/DemoApplication.java	(revision f1c6a71836c516581ea70db523a7a6cb9bd77e78)
@@ -3,4 +3,7 @@
 import org.springframework.boot.SpringApplication;
 import org.springframework.boot.autoconfigure.SpringBootApplication;
+import org.springframework.context.annotation.Bean;
+import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder;
+import org.springframework.security.crypto.password.PasswordEncoder;
 
 @SpringBootApplication
@@ -11,3 +14,8 @@
 	}
 
+	@Bean
+	PasswordEncoder passwordEncoder() {
+		return new BCryptPasswordEncoder(12);
+	}
+
 }
Index: src/main/java/com/db/finki/www/build_board/config/BeanConfig.java
===================================================================
--- src/main/java/com/db/finki/www/build_board/config/BeanConfig.java	(revision f1c6a71836c516581ea70db523a7a6cb9bd77e78)
+++ src/main/java/com/db/finki/www/build_board/config/BeanConfig.java	(revision f1c6a71836c516581ea70db523a7a6cb9bd77e78)
@@ -0,0 +1,14 @@
+package com.db.finki.www.build_board.config;
+
+import com.db.finki.www.build_board.service.AuthenticationSuccessHandlerImpl;
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
+import org.springframework.security.web.authentication.AuthenticationSuccessHandler;
+
+@Configuration
+public class BeanConfig {
+    @Bean
+    public AuthenticationSuccessHandler authenticationSuccessHandler() {
+        return new AuthenticationSuccessHandlerImpl();
+    }
+}
Index: src/main/java/com/db/finki/www/build_board/config/WebSecurityConfig.java
===================================================================
--- src/main/java/com/db/finki/www/build_board/config/WebSecurityConfig.java	(revision f1c6a71836c516581ea70db523a7a6cb9bd77e78)
+++ src/main/java/com/db/finki/www/build_board/config/WebSecurityConfig.java	(revision f1c6a71836c516581ea70db523a7a6cb9bd77e78)
@@ -0,0 +1,63 @@
+package com.db.finki.www.build_board.config;
+
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
+import org.springframework.security.authentication.AuthenticationManager;
+import org.springframework.security.authentication.AuthenticationProvider;
+import org.springframework.security.authentication.dao.DaoAuthenticationProvider;
+import org.springframework.security.config.Customizer;
+import org.springframework.security.config.annotation.authentication.configuration.AuthenticationConfiguration;
+import org.springframework.security.config.annotation.web.builders.HttpSecurity;
+import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity;
+import org.springframework.security.config.annotation.web.configurers.AbstractHttpConfigurer;
+import org.springframework.security.core.userdetails.UserDetailsService;
+import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder;
+import org.springframework.security.crypto.password.PasswordEncoder;
+import org.springframework.security.web.SecurityFilterChain;
+import org.springframework.security.web.authentication.AuthenticationSuccessHandler;
+
+@Configuration
+@EnableWebSecurity
+public class WebSecurityConfig {
+
+    private final PasswordEncoder passwordEncoder;
+    private final UserDetailsService userDetailsService;
+    private final AuthenticationSuccessHandler successHandler;
+
+
+    public WebSecurityConfig(PasswordEncoder passwordEncoder, UserDetailsService userDetailsService, AuthenticationSuccessHandler successHandler) {
+        this.passwordEncoder = passwordEncoder;
+        this.userDetailsService = userDetailsService;
+        this.successHandler = successHandler;
+    }
+
+    @Bean
+    public SecurityFilterChain securityFilterChain(HttpSecurity http) throws Exception {
+        http
+                .csrf(AbstractHttpConfigurer::disable)
+                .authorizeHttpRequests(request ->
+                        request
+                                .anyRequest().authenticated()
+                ).formLogin(formLogin ->
+                        formLogin.permitAll()
+                                .successHandler(successHandler)
+                                .defaultSuccessUrl("/")
+                        );
+
+        return http.build();
+
+    }
+
+    @Bean
+    public AuthenticationProvider authenticationProvider() {
+        DaoAuthenticationProvider daoAuthenticationProvider = new DaoAuthenticationProvider();
+        daoAuthenticationProvider.setPasswordEncoder(passwordEncoder);
+        daoAuthenticationProvider.setUserDetailsService(userDetailsService);
+        return daoAuthenticationProvider;
+    }
+
+    @Bean
+    public AuthenticationManager authenticationManager(AuthenticationConfiguration config) throws Exception {
+        return config.getAuthenticationManager();
+    }
+}
Index: src/main/java/com/db/finki/www/build_board/controller/HomePageController.java
===================================================================
--- src/main/java/com/db/finki/www/build_board/controller/HomePageController.java	(revision f1c6a71836c516581ea70db523a7a6cb9bd77e78)
+++ src/main/java/com/db/finki/www/build_board/controller/HomePageController.java	(revision f1c6a71836c516581ea70db523a7a6cb9bd77e78)
@@ -0,0 +1,14 @@
+package com.db.finki.www.build_board.controller;
+
+import org.springframework.stereotype.Controller;
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.RequestMapping;
+
+@Controller
+@RequestMapping("/")
+public class HomePageController {
+    @GetMapping
+    public String homePage() {
+        return "home";
+    }
+}
Index: src/main/java/com/db/finki/www/build_board/entity/BBUser.java
===================================================================
--- src/main/java/com/db/finki/www/build_board/entity/BBUser.java	(revision f1c6a71836c516581ea70db523a7a6cb9bd77e78)
+++ src/main/java/com/db/finki/www/build_board/entity/BBUser.java	(revision f1c6a71836c516581ea70db523a7a6cb9bd77e78)
@@ -0,0 +1,48 @@
+package com.db.finki.www.build_board.entity;
+
+import jakarta.persistence.*;
+import lombok.Getter;
+import lombok.Setter;
+import org.springframework.security.core.GrantedAuthority;
+import org.springframework.security.core.userdetails.UserDetails;
+
+import java.io.Serializable;
+import java.time.LocalDateTime;
+import java.util.Collection;
+import java.util.List;
+@Entity
+@Table(name = "users")
+@Getter @Setter
+public class BBUser implements UserDetails, Serializable {
+
+    @Id
+    @GeneratedValue(strategy = GenerationType.IDENTITY)
+    private int id;
+    private String username;
+    private String password;
+    private String description;
+    @Column(name = "registered_at")
+    private LocalDateTime registeredAt;
+    @Column(name = "is_activate")
+    private boolean isEnabled;
+    private String sex;
+
+    @Override
+    public boolean isEnabled() {
+        return isEnabled;
+    }
+
+    @Override
+    public String getUsername() {
+        return username;
+    }
+    @Override
+    public String getPassword() {
+        return password;
+    }
+    @Override
+    public Collection<? extends GrantedAuthority> getAuthorities() {
+        return List.of();
+    }
+
+}
Index: src/main/java/com/db/finki/www/build_board/repository/UserRepository.java
===================================================================
--- src/main/java/com/db/finki/www/build_board/repository/UserRepository.java	(revision f1c6a71836c516581ea70db523a7a6cb9bd77e78)
+++ src/main/java/com/db/finki/www/build_board/repository/UserRepository.java	(revision f1c6a71836c516581ea70db523a7a6cb9bd77e78)
@@ -0,0 +1,12 @@
+package com.db.finki.www.build_board.repository;
+
+import com.db.finki.www.build_board.entity.BBUser;
+import org.springframework.data.jpa.repository.JpaRepository;
+import org.springframework.stereotype.Repository;
+
+import java.util.Optional;
+
+@Repository
+public interface UserRepository extends JpaRepository<BBUser, Long> {
+    Optional<BBUser> findByUsername(String username);
+}
Index: src/main/java/com/db/finki/www/build_board/service/AuthenticationSuccessHandlerImpl.java
===================================================================
--- src/main/java/com/db/finki/www/build_board/service/AuthenticationSuccessHandlerImpl.java	(revision f1c6a71836c516581ea70db523a7a6cb9bd77e78)
+++ src/main/java/com/db/finki/www/build_board/service/AuthenticationSuccessHandlerImpl.java	(revision f1c6a71836c516581ea70db523a7a6cb9bd77e78)
@@ -0,0 +1,21 @@
+package com.db.finki.www.build_board.service;
+
+import com.db.finki.www.build_board.entity.BBUser;
+import jakarta.servlet.ServletException;
+import jakarta.servlet.http.HttpServletRequest;
+import jakarta.servlet.http.HttpServletResponse;
+import org.springframework.context.annotation.Primary;
+import org.springframework.security.core.Authentication;
+import org.springframework.security.web.authentication.AuthenticationSuccessHandler;
+import org.springframework.stereotype.Component;
+
+import java.io.IOException;
+
+public class AuthenticationSuccessHandlerImpl implements AuthenticationSuccessHandler {
+    @Override
+    public void onAuthenticationSuccess(HttpServletRequest request, HttpServletResponse response, Authentication authentication) throws IOException, ServletException {
+        BBUser user = (BBUser) authentication.getPrincipal();
+        request.getSession().setAttribute("user", user);
+        System.out.println("USER: " + user.getUsername());
+    }
+}
Index: src/main/java/com/db/finki/www/build_board/service/BBUserDetailsService.java
===================================================================
--- src/main/java/com/db/finki/www/build_board/service/BBUserDetailsService.java	(revision f1c6a71836c516581ea70db523a7a6cb9bd77e78)
+++ src/main/java/com/db/finki/www/build_board/service/BBUserDetailsService.java	(revision f1c6a71836c516581ea70db523a7a6cb9bd77e78)
@@ -0,0 +1,21 @@
+package com.db.finki.www.build_board.service;
+
+import com.db.finki.www.build_board.repository.UserRepository;
+import org.springframework.security.core.userdetails.UserDetails;
+import org.springframework.security.core.userdetails.UserDetailsService;
+import org.springframework.security.core.userdetails.UsernameNotFoundException;
+import org.springframework.stereotype.Service;
+
+@Service
+public class BBUserDetailsService implements UserDetailsService {
+    private final UserRepository userRepository;
+
+    public BBUserDetailsService(UserRepository userRepository) {
+        this.userRepository = userRepository;
+    }
+
+    @Override
+    public UserDetails loadUserByUsername(String username) throws UsernameNotFoundException {
+        return userRepository.findByUsername(username).orElseThrow(() -> new UsernameNotFoundException("User not found with username: " + username));
+    }
+}
Index: src/main/resources/db/migration/V3__init_ddl.sql
===================================================================
--- src/main/resources/db/migration/V3__init_ddl.sql	(revision 2d3f3a31f600db46ca1196dd4f75fe4c39e3b6bf)
+++ src/main/resources/db/migration/V3__init_ddl.sql	(revision f1c6a71836c516581ea70db523a7a6cb9bd77e78)
@@ -35,6 +35,9 @@
 DROP VIEW IF EXISTS v_project_owner CASCADE;
 DROP VIEW IF EXISTS v_moderator CASCADE;
-DROP FUNCTION IF EXISTS fn_project_insert_child_topic CASCADE;
-DROP FUNCTION IF EXISTS fn_validate_same_parent CASCADE;
+drop function if exists fn_insert_project_manager CASCADE;
+drop function if exists fn_insert_topics_creator_as_moderator CASCADE;
+drop function if exists fn_validate_topic_title CASCADE;
+drop function if exists clean_tables CASCADE;
+drop function if exists clean_routines CASCADE;
 DROP TRIGGER IF EXISTS validate_same_parent ON discussion_thread CASCADE;
 ---- DDL
Index: src/main/resources/templates/home.html
===================================================================
--- src/main/resources/templates/home.html	(revision f1c6a71836c516581ea70db523a7a6cb9bd77e78)
+++ src/main/resources/templates/home.html	(revision f1c6a71836c516581ea70db523a7a6cb9bd77e78)
@@ -0,0 +1,22 @@
+<!DOCTYPE html>
+<html lang="en">
+<head>
+    <meta charset="UTF-8">
+    <title>Home Page</title>
+</head>
+<body>
+
+<nav>
+    Test
+<!--    nezz zosto e null ova i od ko ke sa  najavit-->
+    <div th:if="${session.user != null}">
+        <p th:text="${session.user.getUsername()}">uasdasd</p>
+    </div>
+    <a href="/login">Log in</a>
+
+</nav>
+<section>
+
+</section>
+</body>
+</html>
