当前位置: 首页 > 知识库问答 >
问题:

Spring security Userdetails不能转换为我自己的用户实现

郁灿
2023-03-14

我有一个User类,它实现了Spring SecurityUser细节。但是,在登录请求的身份验证期间,它会给出一个ClassCastExceptionUser细节不能强制转换为我的User类。

完整的错误:

java.lang.ClassCastException:类org.springframework.security.core.userdetails.User不能转换为类nl.teamrepositories.vliegmaatschappij.security.domain.User(org.springframework.security.core.userdetails.User在loader'app'的未命名模块中;nl.teamrepositories.vliegmaatschappij.security.domain.User在loaderorg.springframework.boot.devtools.restart.classloader.RestartClassLoader@6ef8cb6的未命名模块中)

用户:

package nl.teamrepositories.vliegmaatschappij.security.domain;

import lombok.Getter;
import lombok.NoArgsConstructor;
import lombok.Setter;
import org.springframework.security.core.GrantedAuthority;
import org.springframework.security.core.authority.SimpleGrantedAuthority;
import org.springframework.security.core.userdetails.UserDetails;

import javax.persistence.*;
import java.util.Collection;
import java.util.List;

@Entity
@Table(name = "users")
@Getter @Setter @NoArgsConstructor
public class User implements UserDetails {

    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    private Long id;

    @Column(nullable = false, unique = true)
    private String firstName;
    private String lastName;
    private String username;
    private String password;

    private boolean enabled;
    private boolean tokenExpired;

    public User(String firstName, String lastName, String username, String password) {
        this.firstName = firstName;
        this.lastName = lastName;
        this.username = username;
        this.password = password;
    }

    @ManyToMany
    @JoinTable(
            name = "users_roles",
            joinColumns = @JoinColumn(
                    name = "user_id", referencedColumnName = "id"),
            inverseJoinColumns = @JoinColumn(
                    name = "role_id", referencedColumnName = "id"))
    private Collection<Role> roles;

    @Override
    public Collection<? extends GrantedAuthority> getAuthorities() {
        return List.of(new SimpleGrantedAuthority("ROLE_USER"));
    }

    @Override
    public String getUsername() {
        return username;
    }

    @Override
    public boolean isAccountNonExpired() {
        return true;
    }

    @Override
    public boolean isAccountNonLocked() {
        return true;
    }

    @Override
    public boolean isCredentialsNonExpired() {
        return true;
    }
    
    @Override
    public boolean isEnabled() {
        return true;
    }
}

在JwtAuthentiationFilter中:

@Override
protected void successfulAuthentication(HttpServletRequest request, HttpServletResponse response,
                                        FilterChain filterChain, Authentication authentication) {
    User user = (User) authentication.getPrincipal(); // this is where the error occurs
    // more code
}

我不明白为什么我的< code>User类不能转换为Spring的< code>UserDetails类。

我应该改变什么?

提前感谢。

共有1个答案

充运浩
2023-03-14

JwtAuthentiationFilter中检查您的导入。我猜您正在使用importorg.springframework.security.core.userdetails.User而不是您自己的类importnl.teamrepositories.vliegmaatschappij.security.domain.User

import nl.teamrepositories.vliegmaatschappij.security.domain.User;
(...)

public class JwtAuthenticationFilter {
    (...)

    @Override
    protected void successfulAuthentication(HttpServletRequest request, HttpServletResponse response,
                                            FilterChain filterChain, Authentication authentication) {
        User user = (User) authentication.getPrincipal(); // this is where the error occurs
        // more code
    }
}

在这里或代码中的其他地方,您使用了错误的< code>User类(Spring one而不是您的类)。

 类似资料:
  • 问题内容: 这是我最后一个问题的后续,从Pandas数据帧转换为TensorFlow张量对象 我现在处于下一步,需要更多帮助。我正在尝试替换此行代码 替换我自己的数据。我找到了这个答案:TensorFlow教程batch_xs,batch_ys = mnist.train.next_batch(100)的next_batch来自哪里?但我不明白: 1)为什么.next_batch()在我的张量上不

  • 我遇到了这个问题,因为我有一个应用程序,有restful服务,但我需要提供一些静态的。在这个应用程序中,我还使用了注释。看起来这个类是公共的,我可以将其子类化,但我不确定如何配置它。我的目标是覆盖这条线,这样我就可以控制404。

  • 问题内容: 我将快速类与我的Objective-C代码混合在一起。使用Swift 2.3,一切都很好,并按预期工作。 我最近转换为Swift 3,由于对Swift 3进行了所有重命名,因此它更新了几个API调用。我明白了。 但是不好的是,Swift 3似乎已经在 我的 Objective-C类之一中重命名了一个方法。我拥有Objective- C类,并且将所需的方法称为:。但是现在,在转换为Swi

  • 问题内容: 我在一个新项目中将Swift样板代码用于Core Data。我的文件有一个定义的单一实体()和一个属性()。 我有一个看起来像这样的文件: 当我运行它时,它起作用: 我什至可以进入iOS模拟器正在使用的SQLite数据库,并确认已添加该行。 但是,当我运行与上面完全相同的代码,但使用而不是时,出现了与…行关联的错误消息,导致崩溃。如果我继续执行,则每次执行线程1时它都会到达并位于线程1

  • 我的班级 我的Hibernate类 此处异常 异常详细信息 我通过JSP处理参数,并在servlet的方法中处理这些参数。我以前能够用ajax将数据作为json来处理,但我更喜欢用会话来做,并且改变了方法。这部分以前没有给出一个错误,现在给出了一个错误。原因何在?

  • 问题内容: 我正在使用从这里获取的这段代码: 我将我的gmail邮件帐户放在发件人和收款人中,但出现此错误: 问题答案: 您没有在计算机上运行SMTP服务器。 请参阅:无法建立连接,因为目标机器主动拒绝了它