Changes between Version 1 and Version 2 of OtherTopics


Ignore:
Timestamp:
09/21/26 17:55:36 (5 days ago)
Author:
192063
Comment:

--

Legend:

Unmodified
Added
Removed
Modified
  • OtherTopics

    v1 v2  
    11==  Други теми (Перформанси, безбедност) ==
    22
    3 Не се изработува
     3=== Безбедност ===
     4* Апликацијата користи Spring Security што е докажан стандард за сетирање на безбедност во апликациите.
     5* Се користи дозволување на клиент кој може да праќа барања до backend
     6{{{
     7  config.setAllowedOrigins(List.of("http://localhost:5173"));
     8}}}
     9* Само рутата за логирање на корисници е дозволена за целата јавност, другите рути бараат автентикација
     10
     11{{{
     12 .authorizeHttpRequests(auth -> auth
     13                        .requestMatchers("/api/auth/login").permitAll()
     14                        .anyRequest().authenticated()
     15                )
     16}}}
     17* Сите корисници се креирани од директор админ и нема стандардна регистрација.
     18= Хеширање на лозинки (Заштита на податоци) =
     19Апликацијата користи BCryptPasswordEncoder како начин за хеширање на лозинки.
     20
     21{{{
     22  @Bean
     23    public PasswordEncoder passwordEncoder() {
     24        return new BCryptPasswordEncoder();
     25    }
     26
     27Кој потоа се користи при хеширање:
     28
     29  String encodedPass = passwordEncoder.encode( blagajnikRequestDTO.getLozinka());
     30}}}
     31
     32
     33= Авторизација (Role-Based Access Control) =
     34Апликацијата користи Roles за дозвола на пристап на некоја активност.
     35Исто така се користи и method security т.е. се користи **@PreAuthorize** анотацијата за заштита на рутите:
     36
     37
     38{{{
     39    @PreAuthorize("hasRole('DIREKTOR_ADMIN')")
     40    @GetMapping
     41    public ResponseEntity<List<KlasResponseDTO>> getAllKlasovi(){
     42        List<KlasResponseDTO> klasovi = this.klasService.getAllKlasovi();
     43        return new  ResponseEntity<>(klasovi, HttpStatus.OK);
     44    }
     45
     46   @GetMapping("/{classId}/students")
     47   @PreAuthorize("hasAnyRole('KLASEN_RAKOVODITEL','DIREKTOR_ADMIN', 'PREDMETEN_NASTAVNIK', 'RODITEL')")
     48   public ResponseEntity<List<UcenikResponseDTO>> getAllStudentsWhoAreInTheSameClass(@PathVariable UUID classId){
     49
     50       List<UcenikResponseDTO> getAllStudentsWhoAreInTheSameClass = this.klasService.getAllStudentsWhoAreInTheSameClass(classId);
     51       return new ResponseEntity<>(getAllStudentsWhoAreInTheSameClass, HttpStatus.OK);
     52}
     53}}}
     54
     55= Користење на сесии =
     56Апликацијата користи сесии и сесиско колаче за заштита од менување на податоците од корисник.
     57
     58{{{
     59  .sessionManagement(session ->
     60                        session.sessionCreationPolicy(SessionCreationPolicy.IF_REQUIRED)
     61                );
     62}}}
     63
     64
     65Но, и автоматско бришење на сесиското колаче при одјава:
     66
     67{{{
     68  .logout(logout->logout
     69                                .logoutUrl("/api/auth/logout")
     70                                .deleteCookies("JSESSIONID")
     71                                .logoutSuccessHandler((request, response, authentication) -> {
     72                                    response.setStatus(200);
     73
     74                                })
     75}}}
     76
     77
     78= Спречување на SQL Injection =
     79За извршување на SQL прашањата, користиме binding. Односно Spring Boot ги третира овие параметри како податоци а не како извршен код.
     80Дел од кодот:
     81
     82{{{
     83  @Modifying
     84    @Transactional
     85    @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)")
     86    void insertUsnaOcenka(
     87            @Param("id") UUID id,
     88            @Param("tema") String tema,
     89            @Param("osvoeni_poeni") Integer osvoeniPoeni,
     90            @Param("max_poeni") Integer maxPoeni,
     91            @Param("vid_isprasuvanje") String vidUsnoIsprasuvanje
     92    );
     93}}}
     94
     95= Безбеднст на ниво на база =
     96
     97Имаме имплементирано посебен корисник кој што не е главниот user:
     98
     99
     100Исто така, користиме тип enum на ниво на база дополнително да се осигураме дека станува збор за вистинската категорија.
     101
     102{{{
     103CREATE TYPE payment_status AS ENUM (
     104    'KREIRANO',
     105    'TX_SUBMITTED',
     106    'ODOBRENO',
     107    'ZAVRSENO',
     108    'FAILED'
     109);
     110
     111CREATE TYPE notice_status AS ENUM (
     112    'PENDING',
     113    'APPROVED',
     114    'REJECTED'
     115);
     116Потоа користиме CHECK за проверка:
     117
     118CREATE TABLE Plakjanje (
     119    id UUID PRIMARY KEY DEFAULT gen_random_uuid (),
     120    status payment_status NOT NULL,
     121    tx_hash VARCHAR(100) UNIQUE,
     122    valuta VARCHAR(10) NOT NULL,
     123    plateno_Na TIMESTAMP,
     124    iznos DECIMAL(38, 18) NOT NULL,
     125    platenoOdRoditel_Id UUID NOT NULL,
     126    soopstenie_za_plakjanje_id UUID NOT NULL,
     127    created_at TIMESTAMP DEFAULT now(),
     128    UNIQUE (
     129        platenoOdRoditel_Id,
     130        soopstenie_za_plakjanje_id
     131    ),
     132    CONSTRAINT chk_tx_hash_when_paid CHECK (
     133        (
     134            status = 'KREIRANO'
     135            AND tx_hash IS NULL
     136        )
     137        OR (
     138            status IN (
     139                'TX_SUBMITTED',
     140                'ODOBRENO',
     141                'ZAVRSENO',
     142                'FAILED'
     143            )
     144            AND tx_hash IS NOT NULL
     145        )
     146    ),
     147    FOREIGN KEY (soopstenie_za_plakjanje_id) REFERENCES SoopstenieZa_Plakjanje (id),
     148    FOREIGN KEY (platenoOdRoditel_Id) REFERENCES Roditel (id)
     149);
     150}}}
     151
     152