wiki:OtherTopics

Version 6 (modified by 192063, 5 days ago) ( diff )

--

Други теми (Перформанси, безбедност)

Безбедност

  • Апликацијата користи Spring Security што е докажан стандард за сетирање на безбедност во апликациите.
  • Се користи дозволување на клиент кој може да праќа барања до backend
      config.setAllowedOrigins(List.of("http://localhost:5173"));
    
  • Само рутата за логирање на корисници е дозволена за целата јавност, другите рути бараат автентикација
 .authorizeHttpRequests(auth -> auth
                        .requestMatchers("/api/auth/login").permitAll()
                        .anyRequest().authenticated()
                )
  • Сите корисници се креирани од директор админ и нема стандардна регистрација.

Хеширање на лозинки (Заштита на податоци)

Апликацијата користи BCryptPasswordEncoder како начин за хеширање на лозинки.

  @Bean
    public PasswordEncoder passwordEncoder() {
        return new BCryptPasswordEncoder();
    }

Кој потоа се користи при хеширање:

  String encodedPass = passwordEncoder.encode( blagajnikRequestDTO.getLozinka());

Авторизација (Role-Based Access Control)

Апликацијата користи Roles за дозвола на пристап на некоја активност. Исто така се користи и method security т.е. се користи @PreAuthorize анотацијата за заштита на рутите:

    @PreAuthorize("hasRole('DIREKTOR_ADMIN')")
    @GetMapping
    public ResponseEntity<List<KlasResponseDTO>> getAllKlasovi(){
        List<KlasResponseDTO> klasovi = this.klasService.getAllKlasovi();
        return new  ResponseEntity<>(klasovi, HttpStatus.OK);
    }

   @GetMapping("/{classId}/students")
   @PreAuthorize("hasAnyRole('KLASEN_RAKOVODITEL','DIREKTOR_ADMIN', 'PREDMETEN_NASTAVNIK', 'RODITEL')")
   public ResponseEntity<List<UcenikResponseDTO>> getAllStudentsWhoAreInTheSameClass(@PathVariable UUID classId){

       List<UcenikResponseDTO> getAllStudentsWhoAreInTheSameClass = this.klasService.getAllStudentsWhoAreInTheSameClass(classId);
       return new ResponseEntity<>(getAllStudentsWhoAreInTheSameClass, HttpStatus.OK);
}

Користење на сесии

Апликацијата користи сесии и сесиско колаче за автентикација на сесијата на корисникот.

  .sessionManagement(session ->
                        session.sessionCreationPolicy(SessionCreationPolicy.IF_REQUIRED)
                );

Но, и автоматско бришење на сесиското колаче при одјава:

  .logout(logout->logout
                                .logoutUrl("/api/auth/logout")
                                .deleteCookies("JSESSIONID")
                                .logoutSuccessHandler((request, response, authentication) -> {
                                    response.setStatus(200);

                                })

Спречување на SQL Injection

За извршување на SQL прашањата, користиме binding. Односно Spring Boot ги третира овие параметри како податоци а не како извршен код. Дел од кодот:

  @Modifying
    @Transactional
    @Query(nativeQuery = true, value = "INSERT INTO Usna_Ocenka (id, tema, osvoeni_poeni, max_poeni, vid_isprasuvanje) VALUES( :id,:tema, :osvoeni_poeni, :max_poeni, :vid_isprasuvanje)")
    void insertUsnaOcenka(
            @Param("id") UUID id,
            @Param("tema") String tema,
            @Param("osvoeni_poeni") Integer osvoeniPoeni,
            @Param("max_poeni") Integer maxPoeni,
            @Param("vid_isprasuvanje") String vidUsnoIsprasuvanje
    );

Безбеднст на ниво на база

Имаме имплементирано посебен корисник кој што не е главниот user:

Исто така, користиме тип enum на ниво на база дополнително да се осигураме дека станува збор за вистинската категорија.

CREATE TYPE payment_status AS ENUM (
    'KREIRANO',
    'TX_SUBMITTED',
    'ODOBRENO',
    'ZAVRSENO',
    'FAILED'
);

CREATE TYPE notice_status AS ENUM (
    'PENDING',
    'APPROVED',
    'REJECTED'
);


CREATE TABLE Plakjanje (
    id UUID PRIMARY KEY DEFAULT gen_random_uuid (),
    status payment_status NOT NULL,
    tx_hash VARCHAR(100) UNIQUE,
    valuta VARCHAR(10) NOT NULL,
    plateno_Na TIMESTAMP,
    iznos DECIMAL(38, 18) NOT NULL,
    platenoOdRoditel_Id UUID NOT NULL,
    soopstenie_za_plakjanje_id UUID NOT NULL,
    created_at TIMESTAMP DEFAULT now(),
    UNIQUE (
        platenoOdRoditel_Id,
        soopstenie_za_plakjanje_id
    ),
    CONSTRAINT chk_tx_hash_when_paid CHECK (
        (
            status = 'KREIRANO'
            AND tx_hash IS NULL
        )
        OR (
            status IN (
                'TX_SUBMITTED',
                'ODOBRENO',
                'ZAVRSENO',
                'FAILED'
            )
            AND tx_hash IS NOT NULL
        )
    ),
    FOREIGN KEY (soopstenie_za_plakjanje_id) REFERENCES SoopstenieZa_Plakjanje (id),
    FOREIGN KEY (platenoOdRoditel_Id) REFERENCES Roditel (id)
);

Користиме и pgcrypto модулот за генерирање на UUID, што дополнително ја зголемува безбедноста за погодување на id и влечење на информации.

CREATE EXTENSION IF NOT EXISTS "pgcrypto";

id UUID PRIMARY KEY DEFAULT gen_random_uuid (),
Note: See TracWiki for help on using the wiki.