SecurityConfiguration.java 4.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899
  1. package pl.sudra.configuration;
  2. import jakarta.annotation.Resource;
  3. import org.springframework.context.annotation.Bean;
  4. import org.springframework.context.annotation.Configuration;
  5. import org.springframework.security.authentication.dao.DaoAuthenticationProvider;
  6. import org.springframework.security.config.annotation.method.configuration.EnableMethodSecurity;
  7. import org.springframework.security.config.annotation.web.builders.HttpSecurity;
  8. import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity;
  9. import org.springframework.security.core.userdetails.User;
  10. import org.springframework.security.core.userdetails.UserDetails;
  11. import org.springframework.security.core.userdetails.UserDetailsService;
  12. import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder;
  13. import org.springframework.security.crypto.password.PasswordEncoder;
  14. import org.springframework.security.provisioning.InMemoryUserDetailsManager;
  15. import org.springframework.security.web.SecurityFilterChain;
  16. import org.springframework.security.web.csrf.CsrfFilter;
  17. import org.springframework.web.filter.CharacterEncodingFilter;
  18. @Configuration
  19. @EnableWebSecurity
  20. //@EnableGlobalMethodSecurity(prePostEnabled = true, securedEnabled = true)
  21. @EnableMethodSecurity
  22. public class SecurityConfiguration {
  23. @Resource(name = "myAppUserDetailsService")
  24. private UserDetailsService userDetailsService;
  25. @Bean
  26. public PasswordEncoder passwordEncoder() {
  27. return new BCryptPasswordEncoder();
  28. }
  29. @Bean
  30. DaoAuthenticationProvider authProvider() {
  31. DaoAuthenticationProvider authProvider = new DaoAuthenticationProvider();
  32. // for database users
  33. authProvider.setUserDetailsService(userDetailsService);
  34. authProvider.setPasswordEncoder(passwordEncoder());
  35. // for in-memory users
  36. // authProvider.setUserDetailsService(userDetailsService());
  37. return authProvider;
  38. }
  39. @Bean
  40. public InMemoryUserDetailsManager userDetailsService() {
  41. UserDetails user = User.withDefaultPasswordEncoder()
  42. .username("user")
  43. .password("user")
  44. .roles("USER")
  45. .build();
  46. UserDetails admin = User.withDefaultPasswordEncoder()
  47. .username("admin")
  48. .password("admin")
  49. .roles("ADMIN", "USER")
  50. .build();
  51. UserDetails student = User.withDefaultPasswordEncoder()
  52. .username("student")
  53. .password("student")
  54. .roles("STUDENT")
  55. .build();
  56. return new InMemoryUserDetailsManager(user, admin, student);
  57. }
  58. @Bean
  59. public SecurityFilterChain filterChain(HttpSecurity http) throws Exception {
  60. CharacterEncodingFilter filter = new CharacterEncodingFilter();
  61. filter.setEncoding("UTF-8");
  62. filter.setForceEncoding(true);
  63. http.addFilterBefore(filter, CsrfFilter.class);
  64. http
  65. .authorizeHttpRequests((authz) -> authz
  66. .requestMatchers("/appUsers*").hasRole("ADMIN")
  67. .requestMatchers("/appUserRole*").hasRole("ADMIN")
  68. .requestMatchers("/exampleOne").hasAuthority("ROLE_USER")
  69. .requestMatchers("/exampleTwo").hasAnyAuthority("ROLE_STUDENT", "ROLE_ADMIN")
  70. .requestMatchers("/exampleThree").hasRole("STUDENT")
  71. .requestMatchers("/login*").anonymous()
  72. .requestMatchers("/appUserRest/*").anonymous()
  73. .anyRequest().authenticated()
  74. )
  75. // .formLogin(form -> form
  76. // .permitAll()
  77. // )
  78. .formLogin(form -> form
  79. .loginPage("/login")
  80. .usernameParameter("login")
  81. .passwordParameter("password")
  82. .failureUrl("/login?error")
  83. .defaultSuccessUrl("/", true)
  84. .permitAll()
  85. )
  86. .exceptionHandling(logout -> logout
  87. .accessDeniedPage("/accessDenied")
  88. )
  89. .httpBasic();
  90. return http.build();
  91. }
  92. }