CustomUserDetailsService.java

package com.ctrlbuy.webshop.service;

import com.ctrlbuy.webshop.security.entity.User;
import com.ctrlbuy.webshop.security.repository.UserRepository;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Primary;
import org.springframework.security.core.userdetails.UserDetails;
import org.springframework.security.core.userdetails.UserDetailsService;
import org.springframework.security.core.userdetails.UsernameNotFoundException;
import org.springframework.stereotype.Service;

@Service
@Primary
public class CustomUserDetailsService implements UserDetailsService {

    private final UserRepository userRepository;

    @Autowired
    public CustomUserDetailsService(UserRepository userRepository) {
        this.userRepository = userRepository;
    }

    @Override
    public UserDetails loadUserByUsername(String username) throws UsernameNotFoundException {
        System.out.println("DEBUG: Attempting to load user: " + username);

        // Sök efter användare med username ELLER email
        User user = userRepository.findByUsername(username)
                .or(() -> userRepository.findByEmail(username))
                .orElseThrow(() -> {
                    System.out.println("DEBUG: User not found: " + username);
                    return new UsernameNotFoundException("User not found: " + username);
                });

        System.out.println("DEBUG: User found: " + user.getUsername());
        System.out.println("DEBUG: User active: " + user.isActive());
        System.out.println("DEBUG: User email verified: " + user.isEmailVerified());
        System.out.println("DEBUG: User roles: " + user.getRoles());

        return createUserDetails(user);
    }

    private UserDetails createUserDetails(User user) {
        // VIKTIGT: Admin-användare ska alltid kunna logga in
        boolean isAdmin = user.getRoles().contains("ROLE_ADMIN");

        System.out.println("DEBUG: Is admin user: " + isAdmin);

        return org.springframework.security.core.userdetails.User
                .withUsername(user.getUsername())
                .password(user.getPassword())
                .authorities(user.getRoles().toArray(new String[0]))
                .accountExpired(false)
                .accountLocked(!isAdmin && !user.isEmailVerified())  // Admin aldrig låst, andra låsta om ej verifierade
                .credentialsExpired(false)
                .disabled(!user.isActive())
                .build();
    }
}