Changes between Version 2 and Version 3 of otherdevelopment


Ignore:
Timestamp:
01/31/26 18:10:07 (25 hours ago)
Author:
231175
Comment:

--

Legend:

Unmodified
Added
Removed
Modified
  • otherdevelopment

    v2 v3  
    8585- **Со индекси:** Index Scan на сите JOIN-ови и WHERE (брзо)
    8686- **Подобрување:** **~30x побрзо**
     87
     88
     89== Безбедност и заштита ==
     90
     91=== JWT Token Authorization (Spring Security) ===
     92
     93JWT (JSON Web Token) e stateless начин на автентикација - server НЕ чува информации за активни сесии во база, туку сите потребни податоци се во самиот token кој корисникот го чува локално/cookie. JWT содржи енкодирана json структура на информации (user_id, email, role, expiry...).
     94{{{!nosql
     95@Bean
     96    public SecurityFilterChain filterChain(HttpSecurity http) throws Exception {
     97        http
     98                .csrf(AbstractHttpConfigurer::disable)
     99                .cors(Customizer.withDefaults())
     100                .sessionManagement(session -> session.sessionCreationPolicy(SessionCreationPolicy.STATELESS))
     101                .authorizeHttpRequests(request -> request
     102                        .requestMatchers("/api/verification-tokens/**").permitAll()
     103                        .requestMatchers("/api/auth/**").permitAll()
     104                        .requestMatchers("/api/courses/**").permitAll()
     105                        .requestMatchers("/api/test/**").permitAll()
     106                        .requestMatchers("/api/auth/oauth2/**").permitAll()
     107                        .requestMatchers("/oauth2/**", "/login/oauth2/**").permitAll()
     108                        .anyRequest().authenticated()
     109                )
     110                .exceptionHandling(exception -> exception
     111                        .authenticationEntryPoint(authenticationEntryPoint)
     112                )
     113                .oauth2Login(oauth2 -> oauth2
     114                        // Use the custom handler instead of defaultSuccessUrl()
     115                        .successHandler(oauth2SuccessHandler)
     116                        .failureUrl("http://localhost:5173/login?error")
     117                )
     118                .authenticationProvider(authenticationProvider)
     119                .addFilterBefore(jwtAuthFilter, UsernamePasswordAuthenticationFilter.class);
     120
     121        return http.build();
     122    }
     123}}}
     124
     125=== Хеширање на пасворди (BCrypt) ===
     126
     127Пасвордите на корисниците и експертите се чуваат во база во хеширана форма преку BCrypt, а не како plain text. Ова овозможува сигурно чување на пасвордите.
     128
     129=== SQL Injection Prevention (Spring JPA/JPQL)
     130
     131Преку JPA/JPQL се спречува SQL Injection напад каде корисникот внесува злонамерен код за да манипулира со базата на податоци. Нападите се избегнуваат преку третирање на параметарот како plain data, а не команда.
     132
     133Безбедно:
     134{{{!nosql
     135    @Query("select u.email from User u where u.id = :userId")
     136    String getUserEmailById(@Param("userId") Long userId);
     137}}}
     138
     139Небезбедно:
     140{{{!nosql
     141    String query = "SELECT * FROM users WHERE email = '" + email + "'";
     142}}}
     143
     144
     145=== CORS Configuration ===
     146
     147CORS е безбеден механизам за заштита од requests од различни домени. Со тоа се заштитуваме од можни злонамерни requests.
     148{{{!nosql
     149@Bean
     150    public CorsConfigurationSource corsConfigurationSource() {
     151        CorsConfiguration config = new CorsConfiguration();
     152        config.addAllowedOriginPattern("http://localhost:*");
     153        config.addAllowedHeader("*");
     154        config.addAllowedMethod("*");
     155        config.setAllowCredentials(true);
     156        config.addExposedHeader(HttpHeaders.CONTENT_DISPOSITION);
     157
     158        UrlBasedCorsConfigurationSource source = new UrlBasedCorsConfigurationSource();
     159        source.registerCorsConfiguration("/**", config);
     160        return source;
     161    }
     162}}}