Changeset cf09deb for ReserveNGo-backend


Ignore:
Timestamp:
01/23/25 05:05:47 (3 months ago)
Author:
Nikola Jordanoski <nikolaj_koko@…>
Branches:
master
Children:
5b32153
Parents:
d157fcd
Message:

Added security (not fully implemented)

Location:
ReserveNGo-backend
Files:
28 added
16 edited

Legend:

Unmodified
Added
Removed
  • ReserveNGo-backend/pom.xml

    rd157fcd rcf09deb  
    5959
    6060        <dependency>
     61            <groupId>io.jsonwebtoken</groupId>
     62            <artifactId>jjwt-api</artifactId>
     63            <version>0.11.5</version>
     64        </dependency>
     65
     66        <dependency>
     67            <groupId>io.jsonwebtoken</groupId>
     68            <artifactId>jjwt-impl</artifactId>
     69            <version>0.11.5</version>
     70        </dependency>
     71
     72        <dependency>
     73            <groupId>io.jsonwebtoken</groupId>
     74            <artifactId>jjwt-jackson</artifactId>
     75            <version>0.11.5</version>
     76        </dependency>
     77
     78        <dependency>
    6179            <groupId>com.h2database</groupId>
    6280            <artifactId>h2</artifactId>
  • ReserveNGo-backend/src/main/java/mk/ukim/finki/it/reservengo/ReserveNGoApplication.java

    rd157fcd rcf09deb  
    1414        SpringApplication.run(ReserveNGoApplication.class, args);
    1515    }
    16 
    17     @Bean
    18     PasswordEncoder passwordEncoder() {
    19         return new BCryptPasswordEncoder(10);
    20     }
    2116}
  • ReserveNGo-backend/src/main/java/mk/ukim/finki/it/reservengo/bootstrap/DataHolder.java

    rd157fcd rcf09deb  
    33import jakarta.annotation.PostConstruct;
    44import mk.ukim.finki.it.reservengo.model.*;
    5 import mk.ukim.finki.it.reservengo.model.enumerations.*;
     5import mk.ukim.finki.it.reservengo.model.enumerations.Position;
     6import mk.ukim.finki.it.reservengo.model.enumerations.Role;
     7import mk.ukim.finki.it.reservengo.model.enumerations.Service;
    68import mk.ukim.finki.it.reservengo.repository.*;
    79import org.springframework.security.crypto.password.PasswordEncoder;
     
    1719    public static List<LocalWorker> workers = new ArrayList<>();
    1820    public static List<LocalManager> managers = new ArrayList<>();
    19     public static List<Event> events = new ArrayList<>();
    20     public static List<Reservation> reservations = new ArrayList<>();
    2121    public static List<Local> locals = new ArrayList<>();
    2222
    2323    private final AdminRepository adminRepository;
    2424    private final CustomerRepository customerRepository;
    25     private final EventRepository eventRepository;
    2625    private final LocalManagerRepository localManagerRepository;
    2726    private final LocalRepository localRepository;
    2827    private final LocalWorkerRepository localWorkerRepository;
    29     private final ReservationRepository reservationRepository;
    3028    private final PasswordEncoder passwordEncoder;
    3129
    32     public DataHolder(AdminRepository adminRepository, CustomerRepository customerRepository, EventRepository eventRepository, LocalManagerRepository localManagerRepository, LocalRepository localRepository, LocalWorkerRepository localWorkerRepository, ReservationRepository reservationRepository, PasswordEncoder passwordEncoder) {
     30    public DataHolder(AdminRepository adminRepository, CustomerRepository customerRepository, LocalManagerRepository localManagerRepository, LocalRepository localRepository, LocalWorkerRepository localWorkerRepository, PasswordEncoder passwordEncoder) {
    3331        this.adminRepository = adminRepository;
    3432        this.customerRepository = customerRepository;
    35         this.eventRepository = eventRepository;
    3633        this.localManagerRepository = localManagerRepository;
    3734        this.localRepository = localRepository;
    3835        this.localWorkerRepository = localWorkerRepository;
    39         this.reservationRepository = reservationRepository;
    4036        this.passwordEncoder = passwordEncoder;
    4137    }
     
    6157        customerRepository.saveAll(customers);
    6258
    63         // Print for debugging purposes
    64         System.out.println("Initialization complete!");
     59        //Local worker
     60        for (int i = 1; i <= 3; i++) {
     61            LocalWorker localWorker = new LocalWorker(
     62                    "FirstName" + i,
     63                    "LastName" + i,
     64                    "Email" + i,
     65                    "Password" + i,
     66                    "PhoneNumber" + i,
     67                    Role.LOCAL_WORKER
     68            );
     69            workers.add(localWorker);
     70        }
     71        localWorkerRepository.saveAll(workers);
     72
     73        //Local manager
     74        for (int i = 1; i <= 3; i++) {
     75            LocalManager manager = new LocalManager(
     76                    "FirstName" + i,
     77                    "LastName" + i,
     78                    "EmailManager" + i,
     79                    "Password" + i,
     80                    "PhoneNumber" + i,
     81                    Role.LOCAL_MANAGER
     82            );
     83            managers.add(manager);
     84        }
     85        localManagerRepository.saveAll(managers);
     86
     87        //Local
     88        List<Service> serviceList = new ArrayList<>(List.of(Service.values()));
     89        List<String> localPhotos;
     90        for (int i = 1; i <= 3; i++) {
     91            localPhotos = new ArrayList<>();
     92            for (int j = 1; j <= 3; j++) {
     93                localPhotos.add("Picture number: " + j);
     94            }
     95            Local local = new Local(
     96                    "Name" + i,
     97                    "Description" + i,
     98                    "Address" + i,
     99                    "WorkingHours" + i,
     100                    serviceList,
     101                    null,
     102                    null,
     103                    localPhotos,
     104                    "MenuPhoto" + i,
     105                    "MenuLink" + i,
     106                    null,
     107                    null,
     108                    null
     109            );
     110            locals.add(local);
     111        }
     112        localRepository.saveAll(locals);
    65113    }
    66114}
  • ReserveNGo-backend/src/main/java/mk/ukim/finki/it/reservengo/config/WebSecurityConfig.java

    rd157fcd rcf09deb  
    11package mk.ukim.finki.it.reservengo.config;
    22
     3import mk.ukim.finki.it.reservengo.config.filter.JWTAuthenticationFilter;
    34import org.springframework.context.annotation.Bean;
    45import org.springframework.context.annotation.Configuration;
     6import org.springframework.security.authentication.AuthenticationProvider;
    57import org.springframework.security.config.annotation.method.configuration.EnableMethodSecurity;
    68import org.springframework.security.config.annotation.web.builders.HttpSecurity;
     
    810import org.springframework.security.config.annotation.web.configurers.AbstractHttpConfigurer;
    911import org.springframework.security.config.annotation.web.configurers.HeadersConfigurer;
     12import org.springframework.security.config.http.SessionCreationPolicy;
    1013import org.springframework.security.web.SecurityFilterChain;
     14import org.springframework.security.web.authentication.UsernamePasswordAuthenticationFilter;
    1115
    1216@Configuration
     
    1418@EnableMethodSecurity
    1519public class WebSecurityConfig {
     20
     21
     22    private final JWTAuthenticationFilter jwtAuthFilter;
     23    private final AuthenticationProvider authenticationProvider;
     24
     25    public WebSecurityConfig(JWTAuthenticationFilter jwtAuthFilter, AuthenticationProvider authenticationProvider) {
     26        this.jwtAuthFilter = jwtAuthFilter;
     27        this.authenticationProvider = authenticationProvider;
     28    }
    1629
    1730    @Bean
     
    2336                )
    2437                .authorizeHttpRequests((requests) -> requests
    25                         .requestMatchers("/**")
     38                        .requestMatchers("/api/auth/**", "/h2/**")
    2639                        .permitAll()
    27                 )
    28                 .formLogin((form) -> form
    29                         .permitAll()
    30                         .defaultSuccessUrl("/", true)
     40                        .anyRequest()
     41                        .authenticated()
    3142                )
    3243                .logout((logout) -> logout
     
    3546                        .deleteCookies("JSESSIONID")
    3647                        .logoutSuccessUrl("/login")
    37                 );
     48                )
     49                .sessionManagement(manager -> manager
     50                        .sessionCreationPolicy(SessionCreationPolicy.STATELESS)
     51                )
     52                .authenticationProvider(authenticationProvider)
     53                .addFilterBefore(jwtAuthFilter, UsernamePasswordAuthenticationFilter.class)
     54        ;
    3855
    3956        return http.build();
  • ReserveNGo-backend/src/main/java/mk/ukim/finki/it/reservengo/model/Admin.java

    rd157fcd rcf09deb  
    1111@AllArgsConstructor
    1212@NoArgsConstructor
    13 public class Admin {
    14     public Admin(String username, String password, Role userRole) {
    15         this.username = username;
    16         this.password = password;
    17         this.userRole = userRole;
     13public class Admin extends User {
     14    public Admin(String email, String password, Role userRole) {
     15        super(null, null, email, password, null, userRole);
    1816    }
    19 
    20     @Id
    21     @GeneratedValue(strategy = GenerationType.IDENTITY)
    22     private Long id;
    23 
    24     @Column(unique = true)
    25     private String username;
    26 
    27     private String password;
    28 
    29     @Enumerated(EnumType.STRING)
    30     private Role userRole = Role.ADMIN;
    3117}
  • ReserveNGo-backend/src/main/java/mk/ukim/finki/it/reservengo/model/Contact.java

    rd157fcd rcf09deb  
    1616@Embeddable
    1717public class Contact {
    18 
    1918    private String phone;
    2019    private String email;
  • ReserveNGo-backend/src/main/java/mk/ukim/finki/it/reservengo/model/Customer.java

    rd157fcd rcf09deb  
    1919@NoArgsConstructor
    2020public class Customer extends User {
    21     public Customer(String firstName, String lastName, String email, String password, String phoneNumber, Role userRole) {
     21    public Customer(String firstName,
     22                    String lastName,
     23                    String email,
     24                    String password,
     25                    String phoneNumber,
     26                    Role userRole) {
    2227        super(firstName, lastName, email, password, phoneNumber, userRole);
    2328    }
     
    2833    @OneToMany
    2934    private List<Local> favouriteLocals;
     35
     36
    3037}
  • ReserveNGo-backend/src/main/java/mk/ukim/finki/it/reservengo/model/LocalManager.java

    rd157fcd rcf09deb  
    1515@NoArgsConstructor
    1616public class LocalManager extends LocalWorker{
    17     public LocalManager(String firstName, String lastName, String email, String password, String phoneNumber, Role userRole, Local local, Position position) {
    18         super(firstName, lastName, email, password, phoneNumber, userRole, local, position);
     17    public LocalManager(String firstName, String lastName, String email, String password, String phoneNumber, Role userRole) {
     18        super(firstName, lastName, email, password, phoneNumber, userRole);
    1919    }
    2020}
  • ReserveNGo-backend/src/main/java/mk/ukim/finki/it/reservengo/model/LocalWorker.java

    rd157fcd rcf09deb  
    1414@AllArgsConstructor
    1515@NoArgsConstructor
    16 public class LocalWorker extends User{
    17     public LocalWorker(String firstName, String lastName, String email, String password, String phoneNumber, Role userRole, Local local, Position position) {
     16public class LocalWorker extends User {
     17    public LocalWorker(String firstName, String lastName, String email, String password, String phoneNumber, Role userRole) {
    1818        super(firstName, lastName, email, password, phoneNumber, userRole);
    19         this.local = local;
    20         this.position = position;
    2119    }
    2220
  • ReserveNGo-backend/src/main/java/mk/ukim/finki/it/reservengo/model/User.java

    rd157fcd rcf09deb  
    44import lombok.AllArgsConstructor;
    55import lombok.Data;
     6import lombok.Getter;
    67import lombok.NoArgsConstructor;
    78import mk.ukim.finki.it.reservengo.model.enumerations.Role;
     9import org.springframework.security.core.GrantedAuthority;
     10import org.springframework.security.core.authority.SimpleGrantedAuthority;
     11import org.springframework.security.core.userdetails.UserDetails;
    812
    9 @Data
     13import java.util.Collection;
     14import java.util.List;
     15
     16//@Data
    1017@Entity
    1118@AllArgsConstructor
     
    1320@Inheritance(strategy = InheritanceType.JOINED)
    1421@Table(name = "app_user")
    15 public class User {
     22public class User implements UserDetails {
    1623    public User(String firstName, String lastName, String email, String password, String phoneNumber, Role userRole) {
    1724        this.firstName = firstName;
     
    2330    }
    2431
     32
     33
     34    @Getter
    2535    @Id
    2636    @GeneratedValue(strategy = GenerationType.IDENTITY)
     
    4050    @Enumerated(EnumType.STRING)
    4151    private Role userRole;
     52
     53    @Override
     54    public Collection<? extends GrantedAuthority> getAuthorities() {
     55        return List.of(new SimpleGrantedAuthority(userRole.name())); //check here:IMPORTANT
     56    }
     57
     58    @Override
     59    public String getPassword() {
     60        return password;
     61    }
     62
     63    @Override
     64    public String getUsername() {
     65        return email;
     66    }
     67
     68    @Override
     69    public boolean isAccountNonExpired() {
     70        return true;
     71    }
     72
     73    @Override
     74    public boolean isAccountNonLocked() {
     75        return true;
     76    }
     77
     78    @Override
     79    public boolean isCredentialsNonExpired() {
     80        return true;
     81    }
     82
     83    @Override
     84    public boolean isEnabled() {
     85        return true;
     86    }
     87
     88    public Long getId() {
     89        return id;
     90    }
     91
     92    public String getFirstName() {
     93        return firstName;
     94    }
     95
     96    public String getLastName() {
     97        return lastName;
     98    }
     99
     100    public String getEmail() {
     101        return email;
     102    }
     103
     104    public String getPhoneNumber() {
     105        return phoneNumber;
     106    }
     107
     108    public Role getUserRole() {
     109        return userRole;
     110    }
     111
     112    @Override
     113    public String toString() {
     114        return "User{" +
     115                "id=" + id +
     116                ", firstName='" + firstName + '\'' +
     117                ", lastName='" + lastName + '\'' +
     118                ", email='" + email + '\'' +
     119                ", password='" + password + '\'' +
     120                ", phoneNumber='" + phoneNumber + '\'' +
     121                ", userRole=" + userRole +
     122                '}';
     123    }
    42124}
  • ReserveNGo-backend/src/main/java/mk/ukim/finki/it/reservengo/model/enumerations/Role.java

    rd157fcd rcf09deb  
    44    ADMIN,
    55    CUSTOMER,
    6     RESTAURANT_MANAGER,
    7     RESTAURANT_WORKER
     6    LOCAL_MANAGER,
     7    LOCAL_WORKER
    88}
  • ReserveNGo-backend/src/main/java/mk/ukim/finki/it/reservengo/repository/CustomerRepository.java

    rd157fcd rcf09deb  
    55import org.springframework.stereotype.Repository;
    66
     7import java.util.Optional;
     8
    79@Repository
    810public interface CustomerRepository extends JpaRepository<Customer, Long> {
     11
     12    Optional<Customer> findByEmail(String email);
    913}
  • ReserveNGo-backend/src/main/java/mk/ukim/finki/it/reservengo/repository/LocalManagerRepository.java

    rd157fcd rcf09deb  
    55import org.springframework.stereotype.Repository;
    66
     7import java.util.Optional;
     8
    79@Repository
    810public interface LocalManagerRepository extends JpaRepository<LocalManager, Long> {
     11    Optional<LocalManager> findByEmail(String email);
    912}
  • ReserveNGo-backend/src/main/java/mk/ukim/finki/it/reservengo/repository/LocalWorkerRepository.java

    rd157fcd rcf09deb  
    55import org.springframework.stereotype.Repository;
    66
     7import java.util.Optional;
     8
    79@Repository
    810public interface LocalWorkerRepository extends JpaRepository<LocalWorker, Long> {
     11    Optional<LocalWorker> findByEmail(String email);
    912}
  • ReserveNGo-backend/src/main/java/mk/ukim/finki/it/reservengo/repository/UserRepository.java

    rd157fcd rcf09deb  
    55import org.springframework.stereotype.Repository;
    66
     7import java.util.Optional;
     8
    79@Repository
    810public interface UserRepository extends JpaRepository<User, Long> {
    9 
     11    Optional<User> findByEmail(String email);
    1012}
  • ReserveNGo-backend/src/main/resources/application.properties

    rd157fcd rcf09deb  
    33spring.profiles.active=h2
    44
     5
Note: See TracChangeset for help on using the changeset viewer.