| | 87 | |
| | 88 | |
| | 89 | == Безбедност и заштита == |
| | 90 | |
| | 91 | === JWT Token Authorization (Spring Security) === |
| | 92 | |
| | 93 | JWT (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 | |
| | 147 | CORS е безбеден механизам за заштита од 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 | }}} |