【问题标题】:Spring security cannot convert value of type [java.lang.String] to required type [SecRole] for property 'secRole'Spring security 无法将类型 [java.lang.String] 的值转换为属性“secRole”所需的类型 [SecRole]
【发布时间】:2014-03-25 14:03:47
【问题描述】:

当我用不同的角色更新我的用户时,我遇到了这两个错误:

Cannot convert value of type [java.lang.String] to required type [rms.SecUser] for property 'secUser': no matching editors or conversion strategy found]

Cannot convert value of type [java.lang.String] to required type [rms.SecRole] for property 'secRole': no matching editors or conversion strategy found]

我正在使用 grails spring 安全插件。

这是我的控制器:

def updateSecUserSecRole(Long id, Long version) {
    def secUserSecRoleInstance = SecUserSecRole.get(id)
    if (!secUserSecRoleInstance) {
        flash.message = message(code: 'default.not.found.message', args: [message(code: 'secUserSecRole.label', default: 'SecUserSecRole'), id])
        redirect(action: "listSecUserSecRole")
        return
    }

    if (version != null) {
        if (secUserSecRoleInstance.version > version) {
            secUserSecRoleInstance.errors.rejectValue("version", "default.optimistic.locking.failure",
                      [message(code: 'secUserSecRole.label', default: 'SecUserSecRole')] as Object[],
                      "Another user has updated this SecUserSecRole while you were editing")
            redirect(action: "listSecUserSecRole")
            return
        }
    }

    secUserSecRoleInstance.properties = params

    if (!secUserSecRoleInstance.save(flush: true)) {
        secUserSecRoleInstance.errors.allErrors.each{
            println  it
        } 

        redirect(action: "listSecUserSecRole")
        return
    }

    flash.message = message(code: 'default.updated.message', args: [message(code: 'secUserSecRole.label', default: 'SecUserSecRole'), secUserSecRoleInstance.id])
    redirect(action: "listSecUserSecRole")
}

这是我在编辑 gsp 中的表单字段的 sn-p:

<g:select class="select2-edit" style="width:30% !important;" id="secUser.id" name="secUser" from="${rms.SecUser.list()}" optionKey="id" optionValue="username" required="" value="${secUserSecRoleInstance?.secUser?.id}" />

<g:select id="secRole.id" name="secRole" from="${rms.SecRole.list()}" optionKey="id" optionValue="authority" required="" value="${secUserSecRoleInstance?.secRole?.id}" />

【问题讨论】:

  • 发生在哪里? secUserSecRoleInstance.properties = params?
  • @IgorArtamonov 最有可能
  • params 是否有可能包含 rms.SecUser
  • @IgorArtamonov 你这是什么意思?像这样params.containsKey(secUser)?

标签: java grails spring-security


【解决方案1】:

我怀疑,在您的表单中,名称应该与 id 匹配。所以,

 id="secUser.id" name="secUser.id" 
 id="secRole.id" name="secRole.id"

更具体地说,表单是使用name 值而不是id 提交的

【讨论】:

  • 这也有效。但正如 igor 所说的那样不安全,所以我结合了你的两个答案
  • 是的,Igor 对安全风险的看法是正确的。我要说的是,您的参数名称是以secUser 而不是“secUser.id”提交的,并且是HTML 事物标准。顺便说一句,如果您提交为“secuUser.id”,Grails 会自动进行查找。至于安全性,请阅读文档grails.org/doc/latest/guide/theWebLayer.html#dataBinding 中的“数据绑定和安全问题”,以获得更安全的方法。
【解决方案2】:

HTML 表单提交以字符(字符串)形式发送数据,即使是 &lt;g:select 标记。对于params.secRoleparams.secUser,你会得到String

但是 SecUserSecRole 期望 SecRoleSecUser 实例代替。您不能将secUserSecRole 分配给字符串(这就是您对secUserSecRoleInstance.properties = params 所做的事情。这也是不安全的),您只需要加载实际数据并传递此对象即可。

喜欢:

secUserSecRoleInstance.secUser = SecUser.get(params.secUser)
secUserSecRoleInstance.secRole = SecRole.get(params.secRole)

【讨论】:

    猜你喜欢
    • 2017-06-14
    • 2021-06-13
    • 2017-04-24
    • 2017-05-12
    • 2018-08-21
    • 2017-04-21
    • 2021-01-23
    • 2018-10-13
    • 2021-07-20
    相关资源
    最近更新 更多