Changes between Initial Version and Version 1 of otherdevelopment


Ignore:
Timestamp:
03/02/26 00:26:43 (2 weeks ago)
Author:
231020
Comment:

--

Legend:

Unmodified
Added
Removed
Modified
  • otherdevelopment

    v1 v1  
     1= Други Развојни Активности =
     2
     3== Анализа на перформанси ==
     4
     5
     6----
     7
     8== Безбедност и заштита ==
     9
     10=== JWT Token Authorization (Spring Security) ===
     11
     12JWT е stateless начин на автентикација - серверот НЕ чува информации за активни сесии во база, туку сите потребни податоци се енкодирани во самиот токен кој корисникот го чува локално. JWT содржи енкодирани информации: user_id, email, role, expiry.
     13
     14Имплементацијата во `SecurityConfig.java` дефинира кои endpoints се јавни и кои бараат автентикација, со посебни правила за ADMIN:
     15
     16{{{
     17// SecurityConfig.java
     18@Bean
     19public SecurityFilterChain filterChain(HttpSecurity http) throws Exception {
     20    http
     21        .cors(cors -> cors.configurationSource(corsConfigurationSource()))
     22        .csrf(csrf -> csrf.disable())
     23        .authorizeHttpRequests(auth -> auth
     24            // Public endpoints - no token required
     25            .requestMatchers("/api/auth/**").permitAll()
     26            .requestMatchers("/api/stocks/**").permitAll()
     27            .requestMatchers("/ws/**", "/topic/**").permitAll()
     28            .requestMatchers("/api/history/**").permitAll()
     29            // Admin only - role-based access control
     30            .requestMatchers("/api/trades/*/approve").hasAuthority("ADMIN")
     31            .requestMatchers("/api/trades/*/decline").hasAuthority("ADMIN")
     32            .requestMatchers("/api/trades/pending").hasAuthority("ADMIN")
     33            // Authenticated users
     34            .requestMatchers("/api/trades/**").authenticated()
     35            .requestMatchers("/api/watchlist/**").authenticated()
     36            .requestMatchers("/api/transactions/**").authenticated()
     37            .anyRequest().authenticated()
     38        )
     39        .sessionManagement(s -> s
     40            .sessionCreationPolicy(SessionCreationPolicy.STATELESS)
     41        )
     42        .authenticationProvider(authenticationProvider)
     43        .addFilterBefore(jwtAuthenticationFilter, UsernamePasswordAuthenticationFilter.class);
     44
     45    return http.build();
     46}
     47}}}
     48
     49Секој HTTP барање поминува низ `JwtAuthenticationFilter` пред да стигне до контролерот. Филтерот го верификува потписот на токенот, го проверува expiry и го вчитува корисникот. Корисник без валиден JWT токен добива HTTP 401 Unauthorized.
     50
     51=== Хеширање на лозинки (BCrypt) ===
     52
     53Лозинките на корисниците се чуваат во базата во хеширана форма преку BCrypt алгоритам, а никогаш како plain text.
     54
     55Во базата колоната `users.password` содржи BCrypt hash со формат `$2a$10$...`.
     56
     57
     58
     59=== CORS Конфигурација ===
     60
     61CORS е безбеден механизам кој ги ограничува HTTP барањата само од дозволени домени.
     62
     63Апликацијата има двојна CORS конфигурација:
     64
     65{{{
     66// SecurityConfig.java - CORS на Spring Security ниво
     67@Bean
     68public CorsConfigurationSource corsConfigurationSource() {
     69    CorsConfiguration config = new CorsConfiguration();
     70    config.setAllowedOrigins(List.of(
     71        "http://localhost:5173",
     72        "http://localhost:5174",
     73        "http://localhost:5175",
     74        "http://localhost:5176",
     75        "http://localhost:3000"
     76    ));
     77    config.setAllowedMethods(List.of("GET", "POST", "PUT", "DELETE", "OPTIONS", "PATCH"));
     78    config.setAllowedHeaders(List.of("*"));
     79    config.setAllowCredentials(true);
     80
     81    UrlBasedCorsConfigurationSource source = new UrlBasedCorsConfigurationSource();
     82    source.registerCorsConfiguration("/**", source);
     83    return source;
     84}
     85}}}
     86
     87{{{
     88// WebConfig.java - CORS на Spring MVC ниво
     89@Configuration
     90public class WebConfig implements WebMvcConfigurer {
     91    @Override
     92    public void addCorsMappings(CorsRegistry registry) {
     93        registry.addMapping("/**")
     94            .allowedOrigins(
     95                "http://localhost:5173",
     96                "http://localhost:5174",
     97                "http://localhost:5175",
     98                "http://localhost:3000"
     99            )
     100            .allowedMethods("*")
     101            .allowedHeaders("*")
     102            .allowCredentials(true);
     103    }
     104}
     105}}}
     106
     107Само барања кои потекнуваат од дозволените localhost портови ќе бидат прифатени. Секое барање од непознат домен добива HTTP 403 уште на ниво на CORS preflight проверката.
     108
     109=== Заштита на податоци на ниво на база ===
     110
     111На ниво на базата на податоци, безбедноста е обезбедена преку:
     112
     113 * '''Role-based CHECK constraints''' - `users.role CHECK (role IN ('USER','ADMIN'))` спречува внесување на невалидни улоги директно во базата
     114 * '''Enum CHECK constraints''' - `transactions.origin CHECK (origin IN ('INTERNAL','EXTERNAL'))` и `user_auth_providers.auth_providers CHECK (auth_providers IN ('INTERNAL','GOOGLE'))` обезбедуваат интегритет на enum вредностите
     115 * '''Foreign key constraints''' - сите референцијални правила се дефинирани на ниво на база, не само на апликациско ниво
     116 * '''UNIQUE constraints''' - `users.email UNIQUE`, `users.username UNIQUE`, `stock.symbol UNIQUE` и `portfolios.user_id UNIQUE` спречуваат дупликати кои би можеле да доведат до безбедносни пропусти
     117...
     118
     119----