首页 > 解决方案 > loadUserByUsername 不会覆盖 springboot 身份验证中的任何内容

问题描述

我是微服务的新手。我想从另一个服务是用户注册服务访问用户名(电子邮件)和密码。当我创建身份验证服务并尝试访问电子邮件密码时,我收到编译时错误。

e: E:\Nil Projects\NewMicroService\security-service\src\main\kotlin\com\security\securityservice\service\JwtUserDetailsService.kt: (16, 5): 'loadUserByUsername' overrides nothing

这是我的代码 jwtuserdetailsservice.kt

package com.security.securityservice.service

import com.security.securityservice.UserRepository
import com.security.securityservice.entity.User
import org.springframework.beans.factory.annotation.Autowired
import org.springframework.security.core.userdetails.UserDetails
import org.springframework.security.core.userdetails.UsernameNotFoundException
import org.springframework.stereotype.Service

@Service
class JwtUserDetailsService {
    @Autowired
    private lateinit var userDTO:UserRepository

    @Throws(Exception::class)
    override fun loadUserByUsername(email: String?): UserDetails {
       val user: User =userDTO.findUserByEmail(email)
        if (userDTO == null){
            UsernameNotFoundException("your email id doesn't exist" + email)
        }
        return org.springframework.security.core.userdetails.User(user.userId.email,user.userId.password,ArrayList())
    }


}

上面我定义了 user.userId.email 和 user.userId.password 因为我在我的 User.kt 中定义了 userId 。这个 userId 来自 userRegistration-service,这个 id 包含用户名和密码,但我无法在身份验证服务中访问电子邮件和密码我在这个特定点收到错误“return org.springframework.security.core.userdetails.User( user.userId.email,user.userId.password,ArrayList())"

用户.kt

package com.security.securityservice.entity

import javax.persistence.Entity
import javax.persistence.GeneratedValue
import javax.persistence.GenerationType
import javax.persistence.Id

@Entity
data class User(
    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    val userAuthId:Long=-1,
    val otp:Int=0,
    val token:String="",
    var userId:Long=-1,
)

响应模板.kt

package com.security.securityservice.VO

import com.security.securityservice.entity.User

data class ResponseTemplate(
    val user:User?=null,
    val userRegistration: UserRegistration?=null,
)

用户注册.kt

package com.security.securityservice.VO

data class UserRegistration(
    val userId:Long=-1,
    val firstName:String="",
    val lastName:String="",
    val email:String="",
)

标签: spring-bootkotlinmicroservices

解决方案


这与微服务无关,而是与简单的 OOP 编程有关。当您说子类override某些行为时,它之前必须有一个,在您的情况下是无。仔细查看类的定义,JwtUserDetailsService没有父类/没有任何接口,因此没有什么可以覆盖的。所以线

override fun loadUserByUsername(email: String?): UserDetails {

永远不会编译。我认为您应该在这里实现*接口以提供行为UserDetailsService。您会看到它loadUserByUsername来自接口UserDetailsS​​ervice 现在代码可以编译,但为了使身份验证正常工作,您必须与身份验证管理器正确集成。


推荐阅读