SecurityConfig.java 5.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124
  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.config.annotation.authentication.builders.AuthenticationManagerBuilder;
  11. import org.springframework.security.config.annotation.method.configuration.EnableMethodSecurity;
  12. import org.springframework.security.config.annotation.web.builders.HttpSecurity;
  13. import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity;
  14. import org.springframework.security.config.http.SessionCreationPolicy;
  15. import org.springframework.security.core.session.SessionRegistry;
  16. import org.springframework.security.core.session.SessionRegistryImpl;
  17. import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder;
  18. import org.springframework.security.crypto.password.PasswordEncoder;
  19. import org.springframework.security.ldap.DefaultSpringSecurityContextSource;
  20. import org.springframework.security.web.SecurityFilterChain;
  21. import org.springframework.security.web.access.expression.WebExpressionAuthorizationManager;
  22. import org.springframework.security.web.authentication.session.CompositeSessionAuthenticationStrategy;
  23. import org.springframework.security.web.authentication.session.ConcurrentSessionControlAuthenticationStrategy;
  24. import org.springframework.security.web.authentication.session.RegisterSessionAuthenticationStrategy;
  25. import org.springframework.security.web.authentication.session.SessionAuthenticationStrategy;
  26. import org.springframework.security.web.authentication.session.SessionFixationProtectionStrategy;
  27. import org.springframework.security.web.session.HttpSessionEventPublisher;
  28. import es.uv.saic.service.AuthProvider;
  29. @Configuration
  30. @EnableWebSecurity
  31. @EnableMethodSecurity
  32. public class SecurityConfig {
  33. @Autowired
  34. AuthProvider authProvider;
  35. @Value("${saic.actuator.validIp}")
  36. private String validIp;
  37. @Bean
  38. public SecurityFilterChain filterChain(HttpSecurity http) throws Exception {
  39. http.authorizeHttpRequests((auth) -> auth
  40. .requestMatchers("/", "/css/**", "/js/**", "/img/**", "/logos/*", "/logos/**").permitAll()
  41. .requestMatchers("/login**").permitAll()
  42. .requestMatchers("/keepalive").permitAll()
  43. .requestMatchers("/actuator/**").access(new WebExpressionAuthorizationManager("hasIpAddress('" + this.validIp + "')"))
  44. .requestMatchers("/actuator/**").access(new WebExpressionAuthorizationManager("hasIpAddress('127.0.0.1')"))
  45. )
  46. .authorizeHttpRequests((auth)-> auth
  47. //.anyRequest().fullyAuthenticated()
  48. .anyRequest().permitAll()
  49. )
  50. .csrf((csrf) -> csrf.disable());
  51. http.sessionManagement((session) -> session
  52. .sessionAuthenticationErrorUrl("/login?error=expired")
  53. .invalidSessionUrl("/login?error=expired")
  54. .maximumSessions(1)
  55. .expiredUrl("/login?error=expired")
  56. .maxSessionsPreventsLogin(false)
  57. .sessionRegistry(sessionRegistry())
  58. )
  59. .sessionManagement((session) -> session
  60. .sessionAuthenticationStrategy(concurrentSession())
  61. .sessionFixation()
  62. .newSession()
  63. .sessionCreationPolicy(SessionCreationPolicy.IF_REQUIRED)
  64. );
  65. http.headers((headers) -> headers
  66. .frameOptions((options) -> options.sameOrigin())
  67. );
  68. return http.build();
  69. }
  70. @Bean
  71. public AuthenticationManager authenticationManager(HttpSecurity http) throws Exception {
  72. return http.getSharedObject(AuthenticationManagerBuilder.class)
  73. .authenticationProvider(authProvider)
  74. .build();
  75. }
  76. @Bean
  77. public SessionRegistry sessionRegistry() {
  78. return new SessionRegistryImpl();
  79. }
  80. @Bean
  81. public DefaultSpringSecurityContextSource contextSource() {
  82. return new DefaultSpringSecurityContextSource(
  83. Collections.singletonList("ldap://ldap.uv.es"), "dc=uv,dc=es");
  84. }
  85. @Bean
  86. public PasswordEncoder passwordEncoder() {
  87. return new BCryptPasswordEncoder();
  88. }
  89. @Bean
  90. public HttpSessionEventPublisher httpSessionEventPublisher() {
  91. return new HttpSessionEventPublisher();
  92. }
  93. @Bean
  94. public CompositeSessionAuthenticationStrategy concurrentSession() {
  95. ConcurrentSessionControlAuthenticationStrategy concurrentAuthenticationStrategy = new ConcurrentSessionControlAuthenticationStrategy(sessionRegistry());
  96. concurrentAuthenticationStrategy.setMaximumSessions(1);
  97. concurrentAuthenticationStrategy.setExceptionIfMaximumExceeded(true);
  98. List<SessionAuthenticationStrategy> delegateStrategies = new ArrayList<SessionAuthenticationStrategy>();
  99. delegateStrategies.add(concurrentAuthenticationStrategy);
  100. delegateStrategies.add(new SessionFixationProtectionStrategy());
  101. delegateStrategies.add(new RegisterSessionAuthenticationStrategy(sessionRegistry()));
  102. CompositeSessionAuthenticationStrategy authenticationStrategy = new CompositeSessionAuthenticationStrategy(delegateStrategies);
  103. return authenticationStrategy;
  104. }
  105. }