2014-02-24 30 views
0

我有這兩個錯誤,當我用不同的角色更新我的用戶:春季安全不能轉換類型的值java.lang.String中]所需類型[SecRole]財產「secRole」

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彈簧安全插件。

這裏是我的控制器:

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我的表單字段的一個片段:

<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}" /> 
+0

在那裏發生的事情提交? 'secUserSecRoleInstance.properties = params'? –

+0

@IgorArtamonov最有可能 – Jan

+0

'params'包含'rms.SecUser'的任何機會? –

回答

1

HTML表單提交發送作爲本地字符數據(一個字符串),甚至<g:select標籤。對於params.secRoleparams.secUser,您得到String

但是SecUserSecRole預期SecRoleSecUser實例。你不能指定secUserSecRole與字符串(這就是你正在做什麼與secUserSecRoleInstance.properties = params也是不安全的),你只需要加載實際數據,並傳遞這些對象。

像:

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

我懷疑,在你的形式,名稱應該匹配的ID。所以,

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

更具體地說,形式與name值而不是id

+0

這也適用。但正如igor所說的那樣不安全,所以我結合了你的兩個答案 – Jan

+0

yes Igor對安全風險是正確的。我所做的一點是你的參數名稱是作爲'secUser'而不是'secUser.id'提交的,並且是HTML標準。順便說一句,如果你提交'secuUser.id',Grails會自動進行查找。關於安全性,請閱讀文檔http://grails.org/doc/latest/guide/theWebLayer.html#dataBinding中的「數據綁定和安全問題」,以獲取更安全的方法。 – aldrin

相關問題