gpt4 book ai didi

spring-boot - Spring Boot 2.1.0使用Kotlin数据类更改安全性?

转载 作者:行者123 更新时间:2023-12-02 13:22:20 25 4
gpt4 key购买 nike

这个问题使我 body 不适。

除了开 Jest ,我一直在尝试使用带有安全性插件的spring-boot向我的Web应用程序添加身份验证层。这是我的数据类。

@Document(collection = "user")
data class User (
var name : String,
var password : String,
var email : String,
var type : String,
var status : String,
var balance : Int
){
@Id val id : String = ObjectId.get().toHexString()
}

经过一些搜索(Ctr + C,Ctr + V),我成功设置了一些自定义身份验证,该身份验证将从数据库中获取用户信息,如下所示:
override fun loadUserByUsername(name : String): UserDetails {
logger.info(name)
val user = repo.findByName(name)
return User(user!!.name,passwordEncoder.encode(user.password),AuthorityUtils.NO_AUTHORITIES)
}

从这里开始的乐趣开始,似乎代码永远不会通过 val user = repo.findByName(name)运行。最糟糕的是,没有异常被抛出,代码运行到该行,其余代码消失了。
出于沮丧,我决定伪造返回对象,以便可以通过这样的身份验证:
    override fun loadUserByUsername(name : String): UserDetails {
logger.info(name)
//val user = repo.findByName(name)
logger.debug("asdkfhasdklfjhasdf")
return User("string",passwordEncoder.encode("you"),AuthorityUtils.NO_AUTHORITIES)
}

现在,终于可以得到一些异常(exception)了:
{
"timestamp": "2018-11-08T18:08:29.541+0000",
"status": 500,
"error": "Internal Server Error",
"message": "No accessor to set property @org.springframework.data.annotation.Id()private final java.lang.String com.sonnbh.jwt.User.id!",
"path": "/user"
}

spring不能访问属性 id的异常状态,因此我将 id的类型从 val更改为 var
@Document(collection = "user")
data class User (
var name : String,
var password : String,
var email : String,
var type : String,
var status : String,
var balance : Int
){
@Id var id : String = ObjectId.get().toHexString()
}

最后,我的应用程序按预期工作。但是,在尝试更深入地研究问题之后,我发现此问题仅发生在 spring-boot v2.1.0上。我使用 spring-boot v2.0.5的旧项目实际上与 val id一起运行良好。这使我提出了一个问题:
  • 我的数据类User的旧实现是否正确?我只是想防止从数据库或init读取User.id后对其进行任何更改。我该怎么做才能改善?
  • 为什么spring-boot v2.1无法像spring-boot v2.0.5那样访问属性?
  • 最佳答案

    2.1中的Spring数据。改变了处理实体中最终字段的方式。它不再使用反射来覆盖字段的不变性,这通常是好的。有几种方法可以解决该问题。

    它们在这里描述:https://jira.spring.io/browse/DATACMNS-1374?focusedCommentId=182289&page=com.atlassian.jira.plugin.system.issuetabpanels%3Acomment-tabpanel#comment-182289

    这是 Spring 队的建议:

    1. Add a @PersistenceConstructor to construct the entity that sets immutable fields.
    2. Add wither methods (MyEntity withXxx(…)) to create a new instance that contains the changed property value.
    3. Alternatively: Use Kotlin's data class feature. This will basically do the same as wither methods.

    关于spring-boot - Spring Boot 2.1.0使用Kotlin数据类更改安全性?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53214153/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com