Просмотр исходного кода

CasAuthoprovider without touching domain

Drowsito 3 недель назад
Родитель
Сommit
0b5a3ce56f

+ 5 - 15
src/main/java/es/uv/saic/config/SecurityConfig.java

@@ -1,10 +1,8 @@
 package es.uv.saic.config;
 package es.uv.saic.config;
 
 
 import java.util.ArrayList;
 import java.util.ArrayList;
-import java.util.Collections;
 import java.util.List;
 import java.util.List;
 
 
-import org.apereo.cas.client.validation.Cas30ServiceTicketValidator;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.beans.factory.annotation.Value;
 import org.springframework.beans.factory.annotation.Value;
 import org.springframework.context.annotation.Bean;
 import org.springframework.context.annotation.Bean;
@@ -15,8 +13,6 @@ import org.springframework.security.cas.ServiceProperties;
 import org.springframework.security.cas.authentication.CasAuthenticationProvider;
 import org.springframework.security.cas.authentication.CasAuthenticationProvider;
 import org.springframework.security.cas.web.CasAuthenticationEntryPoint;
 import org.springframework.security.cas.web.CasAuthenticationEntryPoint;
 import org.springframework.security.cas.web.CasAuthenticationFilter;
 import org.springframework.security.cas.web.CasAuthenticationFilter;
-import es.uv.saic.service.CasUserDetailService;
-import org.springframework.security.config.annotation.authentication.builders.AuthenticationManagerBuilder;
 import org.springframework.security.config.annotation.method.configuration.EnableMethodSecurity;
 import org.springframework.security.config.annotation.method.configuration.EnableMethodSecurity;
 import org.springframework.security.config.annotation.web.builders.HttpSecurity;
 import org.springframework.security.config.annotation.web.builders.HttpSecurity;
 import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity;
 import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity;
@@ -25,7 +21,6 @@ import org.springframework.security.core.session.SessionRegistry;
 import org.springframework.security.core.session.SessionRegistryImpl;
 import org.springframework.security.core.session.SessionRegistryImpl;
 import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder;
 import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder;
 import org.springframework.security.crypto.password.PasswordEncoder;
 import org.springframework.security.crypto.password.PasswordEncoder;
-import org.springframework.security.ldap.DefaultSpringSecurityContextSource;
 import org.springframework.security.web.SecurityFilterChain;
 import org.springframework.security.web.SecurityFilterChain;
 import org.springframework.security.web.access.expression.WebExpressionAuthorizationManager;
 import org.springframework.security.web.access.expression.WebExpressionAuthorizationManager;
 import org.springframework.security.web.authentication.LoginUrlAuthenticationEntryPoint;
 import org.springframework.security.web.authentication.LoginUrlAuthenticationEntryPoint;
@@ -36,6 +31,7 @@ import org.springframework.security.web.authentication.session.SessionAuthentica
 import org.springframework.security.web.authentication.session.SessionFixationProtectionStrategy;
 import org.springframework.security.web.authentication.session.SessionFixationProtectionStrategy;
 import org.springframework.security.web.session.HttpSessionEventPublisher;
 import org.springframework.security.web.session.HttpSessionEventPublisher;
 import es.uv.saic.service.AuthProvider;
 import es.uv.saic.service.AuthProvider;
+import es.uv.saic.service.CasAuthProvider;
 
 
 
 
 @Configuration
 @Configuration
@@ -159,17 +155,11 @@ public class SecurityConfig {
 	@Bean
 	@Bean
 	public CasAuthenticationProvider casAuthenticationProvider(
 	public CasAuthenticationProvider casAuthenticationProvider(
 			ServiceProperties sp, 
 			ServiceProperties sp, 
-			CasUserDetailService userDetailsService) {
+			CasAuthProvider customProvider) {
 		
 		
-		CasAuthenticationProvider provider = new CasAuthenticationProvider();
-		provider.setAuthenticationUserDetailsService(userDetailsService);
-		provider.setServiceProperties(sp);
-		
-		provider.setTicketValidator(new Cas30ServiceTicketValidator("http://localhost:8085/cas"));
-		
-		provider.setKey("CAS_PROVIDER_SAIC_LOCAL");
-		
-		return provider;
+		customProvider.setServiceProperties(sp);
+
+		return customProvider;
 	}
 	}
 
 
     @Bean
     @Bean

+ 69 - 0
src/main/java/es/uv/saic/service/CasAuthProvider.java

@@ -0,0 +1,69 @@
+package es.uv.saic.service;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import org.apereo.cas.client.validation.Cas30ServiceTicketValidator;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.security.cas.authentication.CasAuthenticationProvider;
+import org.springframework.security.cas.authentication.CasAuthenticationToken;
+import org.springframework.security.core.Authentication;
+import org.springframework.security.core.AuthenticationException;
+import org.springframework.security.core.authority.SimpleGrantedAuthority;
+import org.springframework.security.core.userdetails.User;
+import org.springframework.security.core.userdetails.UsernameNotFoundException;
+import org.springframework.stereotype.Component;
+
+import es.uv.saic.shared.domain.Usuari;
+import jakarta.annotation.PostConstruct;
+
+@Component
+public class CasAuthProvider extends CasAuthenticationProvider{
+    @Autowired
+    private UsuariService us;
+
+    @Autowired
+    private UsuarisRolService urs;
+
+    @PostConstruct
+    public void init() {
+        this.setAuthenticationUserDetailsService(
+            token -> new User(token.getName(), "", List.of()
+            )
+        );
+        
+        this.setTicketValidator(new Cas30ServiceTicketValidator("http://localhost:8085/cas"));
+        this.setKey("CAS_PROVIDER_SAIC_LOCAL");
+    }
+
+    @Override
+     public Authentication authenticate(Authentication authentication) throws AuthenticationException {
+        CasAuthenticationToken casToken = (CasAuthenticationToken) super.authenticate(authentication);
+
+        String username = casToken.getName();
+        Usuari u = this.us.findByUsername(username);
+
+        if (u == null) throw new UsernameNotFoundException("Usuario no encontrado: " + username);
+
+        u.setGranted(this.urs.isGrantedUser(u));
+        u.setAdmin(this.urs.isAdminUser(u));
+        u.setDataTest(this.urs.isDataTestUser(u));
+
+        List<SimpleGrantedAuthority> auths = new ArrayList<>();
+        auths.add(new SimpleGrantedAuthority("ROLE_USER"));
+        if (u.isAdmin())    auths.add(new SimpleGrantedAuthority("ROLE_ADMIN"));
+        if (u.isGranted())  auths.add(new SimpleGrantedAuthority("ROLE_MANAGER"));
+        if (u.isDataTest()) auths.add(new SimpleGrantedAuthority("ROLE_TESTER"));
+
+        User userDetails = new User(username, "", auths);
+
+        return new CasAuthenticationToken(
+            "CAS_PROVIDER_SAIC_LOCAL",
+            u,  
+            casToken.getCredentials(),
+            auths,
+            userDetails,
+            casToken.getAssertion()
+        );
+    }
+}

+ 0 - 43
src/main/java/es/uv/saic/service/CasUserDetailService.java

@@ -1,43 +0,0 @@
-package es.uv.saic.service;
-
-import java.util.ArrayList;
-import java.util.List;
-
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.security.cas.authentication.CasAssertionAuthenticationToken;
-import org.springframework.security.core.authority.SimpleGrantedAuthority;
-import org.springframework.security.core.userdetails.AuthenticationUserDetailsService;
-import org.springframework.security.core.userdetails.UsernameNotFoundException;
-import org.springframework.stereotype.Service;
-
-import es.uv.saic.shared.domain.Usuari;
-
-@Service
-public class CasUserDetailService implements AuthenticationUserDetailsService<CasAssertionAuthenticationToken> {
-    @Autowired
-    private UsuariService us;
-    @Autowired 
-    private UsuarisRolService urs;
-
-    @Override
-    public Usuari loadUserDetails(CasAssertionAuthenticationToken token) {
-        String username = token.getName();
-        Usuari u = this.us.findByUsername(username);
-
-        if (u == null) throw new UsernameNotFoundException("Usuario no encontrado");
-
-        // Igual que en AuthProvider
-        u.setGranted(this.urs.isGrantedUser(u));
-        u.setAdmin(this.urs.isAdminUser(u));
-        u.setDataTest(this.urs.isDataTestUser(u));
-
-        List<SimpleGrantedAuthority> auths = new ArrayList<>();
-        auths.add(new SimpleGrantedAuthority("ROLE_USER"));
-        if (u.isAdmin())   auths.add(new SimpleGrantedAuthority("ROLE_ADMIN"));
-        if (u.isGranted()) auths.add(new SimpleGrantedAuthority("ROLE_MANAGER"));
-        if (u.isDataTest()) auths.add(new SimpleGrantedAuthority("ROLE_TESTER"));
-
-        u.setAuthorities(auths);
-        return u;
-    }
-}