RoleInterceptor.java

  1. package edu.ucsb.cs156.rec.interceptors;

  2. import org.springframework.beans.factory.annotation.Autowired;
  3. import org.springframework.stereotype.Component;
  4. import org.springframework.web.servlet.HandlerInterceptor;
  5. import org.springframework.web.servlet.ModelAndView;

  6. import edu.ucsb.cs156.rec.repositories.UserRepository;
  7. import jakarta.servlet.http.HttpServlet;
  8. import jakarta.servlet.http.HttpServletRequest;
  9. import jakarta.servlet.http.HttpServletResponse;
  10. import lombok.extern.slf4j.Slf4j;

  11. import org.springframework.security.core.authority.SimpleGrantedAuthority;
  12. import org.springframework.beans.factory.annotation.Autowired;
  13. import org.springframework.beans.factory.annotation.Value;
  14. import org.springframework.security.core.Authentication;
  15. import org.springframework.security.core.GrantedAuthority;
  16. import org.springframework.security.core.context.SecurityContext;
  17. import org.springframework.security.core.context.SecurityContextHolder;
  18. import org.springframework.security.oauth2.client.authentication.OAuth2AuthenticationToken;
  19. import org.springframework.security.oauth2.core.user.OAuth2User;

  20. import java.util.Optional;
  21. import java.util.HashSet;
  22. import java.util.Set;
  23. import java.util.Collection;
  24. import java.util.stream.Collectors;
  25. import edu.ucsb.cs156.rec.entities.User;

  26. @Slf4j
  27. @Component
  28. public class RoleInterceptor implements HandlerInterceptor {

  29.     @Autowired
  30.     UserRepository userRepository;

  31.     @Override
  32.     public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) {
  33.         Authentication authentication = SecurityContextHolder.getContext().getAuthentication();

  34.         if (authentication.getClass() == OAuth2AuthenticationToken.class) {
  35.             OAuth2User principal = ((OAuth2AuthenticationToken) authentication).getPrincipal();
  36.             String email = principal.getAttribute("email");
  37.             Optional<User> optionalUser = userRepository.findByEmail(email);
  38.             if (optionalUser.isPresent()) {
  39.                 User user = optionalUser.get();
  40.                 Collection<? extends GrantedAuthority> authorities = authentication.getAuthorities();
  41.                 Set<GrantedAuthority> revisedAuthorities = authorities.stream().filter(
  42.                         grantedAuth -> !grantedAuth.getAuthority().equals("ROLE_ADMIN")
  43.                                 && !grantedAuth.getAuthority().equals("ROLE_PROFESSOR")
  44.                                 && !grantedAuth.getAuthority().equals("ROLE_STUDENT"))
  45.                         .collect(Collectors.toSet());
  46.                 if (user.getAdmin()) {
  47.                     revisedAuthorities.add(new SimpleGrantedAuthority("ROLE_ADMIN"));
  48.                 }
  49.                 if (user.getProfessor()) {
  50.                     revisedAuthorities.add(new SimpleGrantedAuthority("ROLE_PROFESSOR"));
  51.                 }
  52.                 if (user.getStudent()) {
  53.                     revisedAuthorities.add(new SimpleGrantedAuthority("ROLE_STUDENT"));
  54.                 }
  55.                 Authentication newAuth = new OAuth2AuthenticationToken(principal, revisedAuthorities,
  56.                         (((OAuth2AuthenticationToken) authentication).getAuthorizedClientRegistrationId()));
  57.                 SecurityContextHolder.getContext().setAuthentication(newAuth);
  58.             }
  59.         }
  60.         return true;
  61.     }
  62. }