| | 1 | == **Spring Security** |
| | 2 | Извадок од нашиот security config:\\ |
| | 3 | {{{ |
| | 4 | |
| | 5 | @Bean |
| | 6 | public SecurityFilterChain securityFilterChain(HttpSecurity http) throws Exception { |
| | 7 | http |
| | 8 | .csrf(AbstractHttpConfigurer::disable) |
| | 9 | .authorizeHttpRequests(reg -> reg |
| | 10 | .requestMatchers("/", "/login", "/register", "/error", |
| | 11 | "/css/**", "/js/**", "/uploads/**", "/logo.png", "catalog").permitAll() |
| | 12 | .requestMatchers("/admin/branded-medicines/**").hasAnyRole("ADMIN","PHARMACIST") |
| | 13 | .requestMatchers("/admin/**").hasRole("ADMIN") |
| | 14 | .requestMatchers("/pharmacist/**").hasRole("PHARMACIST") |
| | 15 | .anyRequest().permitAll() |
| | 16 | ) |
| | 17 | .formLogin(login -> login |
| | 18 | .loginPage("/login") |
| | 19 | .defaultSuccessUrl("/profile", true) |
| | 20 | .permitAll() |
| | 21 | ) |
| | 22 | .logout(logout -> logout |
| | 23 | .logoutUrl("/logout") |
| | 24 | .logoutSuccessUrl("/login?logout") |
| | 25 | .permitAll() |
| | 26 | ) |
| | 27 | .sessionManagement(sm -> sm.sessionCreationPolicy(SessionCreationPolicy.IF_REQUIRED)); |
| | 28 | |
| | 29 | return http.build(); |
| | 30 | } |
| | 31 | |
| | 32 | |
| | 33 | }}} |
| | 34 | |
| | 35 | Админ рутите (/admin/*) се достапни само за корисници кои се ADMIN, делот за фармацевти (/pharmacist/*) само за PHARMACIST, а клиентски функционалности се ограничуваат по потреба за CLIENT.\\ |
| | 36 | Останатите јавни рути се permitAll, а чувствителните се заштитени со hasRole/hasAnyRole (на пр. /admin/branded-medicines/* за ADMIN или PHARMACIST). |
| | 37 | Автентикацијата е остварена преку custom login форма и redirect на /profile при успешна автентикација. |