SecurityConfig.java 6.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151
  1. package es.uv.saic.config;
  2. import java.util.ArrayList;
  3. import java.util.Collections;
  4. import java.util.List;
  5. import org.springframework.beans.factory.annotation.Autowired;
  6. import org.springframework.beans.factory.annotation.Value;
  7. import org.springframework.context.annotation.Bean;
  8. import org.springframework.context.annotation.Configuration;
  9. import org.springframework.security.authentication.AuthenticationManager;
  10. import org.springframework.security.authorization.AuthorizationDecision;
  11. import org.springframework.security.authorization.AuthorizationManager;
  12. import org.springframework.security.config.annotation.authentication.builders.AuthenticationManagerBuilder;
  13. import org.springframework.security.config.annotation.method.configuration.EnableMethodSecurity;
  14. import org.springframework.security.config.annotation.web.builders.HttpSecurity;
  15. import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity;
  16. import org.springframework.security.config.http.SessionCreationPolicy;
  17. import org.springframework.security.core.session.SessionRegistry;
  18. import org.springframework.security.core.session.SessionRegistryImpl;
  19. import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder;
  20. import org.springframework.security.crypto.password.PasswordEncoder;
  21. import org.springframework.security.ldap.DefaultSpringSecurityContextSource;
  22. import org.springframework.security.web.SecurityFilterChain;
  23. import org.springframework.security.web.access.intercept.RequestAuthorizationContext;
  24. import org.springframework.security.web.authentication.session.CompositeSessionAuthenticationStrategy;
  25. import org.springframework.security.web.authentication.session.ConcurrentSessionControlAuthenticationStrategy;
  26. import org.springframework.security.web.authentication.session.RegisterSessionAuthenticationStrategy;
  27. import org.springframework.security.web.authentication.session.SessionAuthenticationStrategy;
  28. import org.springframework.security.web.authentication.session.SessionFixationProtectionStrategy;
  29. import org.springframework.security.web.session.HttpSessionEventPublisher;
  30. import org.springframework.security.web.util.matcher.IpAddressMatcher;
  31. import es.uv.saic.service.AuthProvider;
  32. import jakarta.servlet.http.HttpServletRequest;
  33. @Configuration
  34. @EnableWebSecurity
  35. @EnableMethodSecurity
  36. public class SecurityConfig {
  37. @Autowired
  38. AuthProvider authProvider;
  39. @Value("${saic.actuator.validIp}")
  40. private String validIp;
  41. @Bean
  42. public SecurityFilterChain filterChain(HttpSecurity http) throws Exception {
  43. http.authorizeHttpRequests((auth) -> auth
  44. .requestMatchers("/", "/css/**", "/js/**", "/img/**", "/logos/*", "/logos/**").permitAll()
  45. .requestMatchers("/login**").permitAll()
  46. .requestMatchers("/keepalive").permitAll()
  47. .requestMatchers("/public/**").permitAll()
  48. .requestMatchers("/actuator/**").access(hasIpAddress(this.validIp))
  49. )
  50. .authorizeHttpRequests((auth)-> auth
  51. //.anyRequest().fullyAuthenticated()
  52. .anyRequest().permitAll()
  53. )
  54. .formLogin((form) -> form
  55. .loginPage("/login")
  56. .defaultSuccessUrl("/procedures?_new=1",true)
  57. .failureUrl("/login?error=noauth")
  58. .successHandler(new AuthSuccessHandler())
  59. .permitAll()
  60. )
  61. .logout((logout) -> logout
  62. .logoutSuccessUrl("/login")
  63. .invalidateHttpSession(true)
  64. .clearAuthentication(true)
  65. .deleteCookies("JSESSIONID")
  66. .deleteCookies("SESSION")
  67. )
  68. .csrf((csrf) -> csrf.disable());
  69. http.sessionManagement((session) -> session
  70. .sessionAuthenticationErrorUrl("/login?error=expired")
  71. .invalidSessionUrl("/login?error=expired")
  72. .maximumSessions(1)
  73. .expiredUrl("/login?error=expired")
  74. .maxSessionsPreventsLogin(false)
  75. .sessionRegistry(sessionRegistry())
  76. )
  77. .sessionManagement((session) -> session
  78. .sessionAuthenticationStrategy(concurrentSession())
  79. .sessionFixation()
  80. .newSession()
  81. .sessionCreationPolicy(SessionCreationPolicy.IF_REQUIRED)
  82. );
  83. http.headers((headers) -> headers
  84. .frameOptions((options) -> options.sameOrigin())
  85. );
  86. return http.build();
  87. }
  88. private static AuthorizationManager<RequestAuthorizationContext> hasIpAddress(String ipAddress) {
  89. IpAddressMatcher ipAddressMatcher = new IpAddressMatcher(ipAddress);
  90. return (authentication, context) -> {
  91. HttpServletRequest request = context.getRequest();
  92. return new AuthorizationDecision(ipAddressMatcher.matches(request));
  93. };
  94. }
  95. @Bean
  96. public AuthenticationManager authenticationManager(HttpSecurity http) throws Exception {
  97. return http.getSharedObject(AuthenticationManagerBuilder.class)
  98. .authenticationProvider(authProvider)
  99. .build();
  100. }
  101. @Bean
  102. public SessionRegistry sessionRegistry() {
  103. return new SessionRegistryImpl();
  104. }
  105. @Bean
  106. public DefaultSpringSecurityContextSource contextSource() {
  107. return new DefaultSpringSecurityContextSource(
  108. Collections.singletonList("ldap://ldap.uv.es"), "dc=uv,dc=es");
  109. }
  110. @Bean
  111. public PasswordEncoder passwordEncoder() {
  112. return new BCryptPasswordEncoder();
  113. }
  114. @Bean
  115. public HttpSessionEventPublisher httpSessionEventPublisher() {
  116. return new HttpSessionEventPublisher();
  117. }
  118. @Bean
  119. public CompositeSessionAuthenticationStrategy concurrentSession() {
  120. ConcurrentSessionControlAuthenticationStrategy concurrentAuthenticationStrategy = new ConcurrentSessionControlAuthenticationStrategy(sessionRegistry());
  121. concurrentAuthenticationStrategy.setMaximumSessions(1);
  122. concurrentAuthenticationStrategy.setExceptionIfMaximumExceeded(true);
  123. List<SessionAuthenticationStrategy> delegateStrategies = new ArrayList<SessionAuthenticationStrategy>();
  124. delegateStrategies.add(concurrentAuthenticationStrategy);
  125. delegateStrategies.add(new SessionFixationProtectionStrategy());
  126. delegateStrategies.add(new RegisterSessionAuthenticationStrategy(sessionRegistry()));
  127. CompositeSessionAuthenticationStrategy authenticationStrategy = new CompositeSessionAuthenticationStrategy(delegateStrategies);
  128. return authenticationStrategy;
  129. }
  130. }