CustomUserDetails.java

package com.yumu.noveltranslator.adapter.out.security;

import com.yumu.noveltranslator.domain.model.User;
import org.springframework.security.core.GrantedAuthority;
import org.springframework.security.core.authority.SimpleGrantedAuthority;
import org.springframework.security.core.userdetails.UserDetails;

import java.util.Collection;
import java.util.Collections;

/**
 * 实现Spring Security的UserDetails接口
 */
public class CustomUserDetails implements UserDetails {

    private User user;
    private final Long userId;
    private final String email;
    private final String userLevel;
    private final Long tenantId;

    public CustomUserDetails(User user) {
        this.user = user;
        this.userId = user.getId();
        this.email = user.getEmail();
        this.userLevel = user.getUserLevel();
        this.tenantId = user.getTenantId();
    }

    /**
     * 轻量构造器(JWT 缓存命中时使用,无需加载完整 User 实体)
     */
    public CustomUserDetails(Long userId, String email, String userLevel, Long tenantId) {
        this.userId = userId;
        this.email = email;
        this.userLevel = userLevel;
        this.tenantId = tenantId;
    }

    /**
     * 轻量构造器(无 email 场景,如 API Key 认证)
     */
    public CustomUserDetails(Long userId, String userLevel, Long tenantId) {
        this(userId, null, userLevel, tenantId);
    }

    @Override
    public Collection<? extends GrantedAuthority> getAuthorities() {
        // 优先使用直接字段(轻量构造器路径)
        String level = userLevel != null ? userLevel : (user != null ? user.getUserLevel() : null);
        String role = "ROLE_" + (level != null ? level.toUpperCase() : "FREE");
        return Collections.singletonList(new SimpleGrantedAuthority(role));
    }

    @Override
    public String getPassword() {
        return user != null ? user.getPassword() : null; // 轻量路径下为 null
    }

    @Override
    public String getUsername() {
        return email != null ? email : (user != null ? user.getEmail() : "user-" + userId);
    }

    @Override
    public boolean isAccountNonExpired() {
        return true; // 账户未过期
    }

    @Override
    public boolean isAccountNonLocked() {
        return true; // 账户未锁定
    }

    @Override
    public boolean isCredentialsNonExpired() {
        return true; // 凭据未过期
    }

    @Override
    public boolean isEnabled() {
        return true; // 账户已启用
    }

    // 提供对领域模型用户的访问
    public User getUser() {
        return user;
    }

    public Long getId() {
        return userId;
    }

    public String getEmail() {
        return email != null ? email : (user != null ? user.getEmail() : null);
    }

    public String getUserLevel() {
        return userLevel;
    }

    public Long getTenantId() {
        return tenantId;
    }
}