22
33import org .springframework .context .annotation .Bean ;
44import org .springframework .context .annotation .Configuration ;
5+ import org .springframework .beans .factory .annotation .Value ;
56import org .springframework .http .HttpMethod ;
7+ import org .springframework .security .core .userdetails .User ;
8+ import org .springframework .security .core .userdetails .UserDetails ;
9+ import org .springframework .security .core .userdetails .UserDetailsService ;
10+ import org .springframework .security .crypto .bcrypt .BCryptPasswordEncoder ;
11+ import org .springframework .security .crypto .password .PasswordEncoder ;
612import org .springframework .security .config .Customizer ;
713import org .springframework .security .config .annotation .web .builders .HttpSecurity ;
814import org .springframework .security .config .annotation .web .configuration .EnableWebSecurity ;
9- import org .springframework .security .config .annotation .web .configurers .AbstractHttpConfigurer ;
1015import org .springframework .security .config .http .SessionCreationPolicy ;
16+ import org .springframework .security .provisioning .InMemoryUserDetailsManager ;
1117import org .springframework .security .web .SecurityFilterChain ;
1218
1319@ Configuration
1420@ EnableWebSecurity
1521public class SecurityConfig {
1622
23+ @ Value ("${app.security.admin.username}" )
24+ private String adminUsername ;
25+
26+ @ Value ("${app.security.admin.password}" )
27+ private String adminPassword ;
28+
29+ @ Value ("${app.security.user.username}" )
30+ private String userUsername ;
31+
32+ @ Value ("${app.security.user.password}" )
33+ private String userPassword ;
34+
35+ @ Value ("${app.security.test.username}" )
36+ private String testUsername ;
37+
38+ @ Value ("${app.security.test.password}" )
39+ private String testPassword ;
40+
1741 @ Bean
1842 SecurityFilterChain securityFilterChain (HttpSecurity http ) throws Exception {
1943 http
20- .csrf (AbstractHttpConfigurer :: disable )
44+ .csrf (csrf -> csrf . ignoringRequestMatchers ( "/random-users/**" ) )
2145 .sessionManagement (session -> session .sessionCreationPolicy (SessionCreationPolicy .STATELESS ))
2246 .httpBasic (Customizer .withDefaults ())
2347 .authorizeHttpRequests (auth -> auth
@@ -29,9 +53,38 @@ SecurityFilterChain securityFilterChain(HttpSecurity http) throws Exception {
2953 "/actuator/health"
3054 ).permitAll ()
3155 .requestMatchers (HttpMethod .OPTIONS , "/**" ).permitAll ()
56+ .requestMatchers (HttpMethod .GET , "/random-users/**" ).hasAnyRole ("ADMIN" , "USER" , "TEST" )
57+ .requestMatchers (HttpMethod .POST , "/random-users/**" ).hasRole ("ADMIN" )
58+ .requestMatchers (HttpMethod .PUT , "/random-users/**" ).hasRole ("ADMIN" )
59+ .requestMatchers (HttpMethod .DELETE , "/random-users/**" ).hasRole ("ADMIN" )
3260 .anyRequest ().authenticated ()
3361 );
3462
3563 return http .build ();
3664 }
65+
66+ @ Bean
67+ UserDetailsService userDetailsService (PasswordEncoder passwordEncoder ) {
68+ UserDetails admin = User .withUsername (adminUsername )
69+ .password (passwordEncoder .encode (adminPassword ))
70+ .roles ("ADMIN" )
71+ .build ();
72+
73+ UserDetails user = User .withUsername (userUsername )
74+ .password (passwordEncoder .encode (userPassword ))
75+ .roles ("USER" )
76+ .build ();
77+
78+ UserDetails test = User .withUsername (testUsername )
79+ .password (passwordEncoder .encode (testPassword ))
80+ .roles ("TEST" )
81+ .build ();
82+
83+ return new InMemoryUserDetailsManager (admin , user , test );
84+ }
85+
86+ @ Bean
87+ PasswordEncoder passwordEncoder () {
88+ return new BCryptPasswordEncoder ();
89+ }
3790}
0 commit comments