【问题标题】:Grails and spring security how to get composite id in controller?Grails和spring security如何在控制器中获取复合ID?
【发布时间】:2014-02-13 16:09:20
【问题描述】:

这是 grails 中的 SecUserSecRole 类

import org.apache.commons.lang.builder.HashCodeBuilder

class SecUserSecRole implements Serializable {

SecUser secUser
SecRole secRole

static mapping = {
id composite: ['secUser', 'secRole'] <----- this
version false
}

boolean equals(other) {
    if (!(other instanceof SecUserSecRole)) {
        return false
    }

    other.secUser?.id == secUser?.id &&
        other.secRole?.id == secRole?.id
}

int hashCode() {
    def builder = new HashCodeBuilder()
    if (secUser) builder.append(secUser.id)
    if (secRole) builder.append(secRole.id)
    builder.toHashCode()
}

static SecUserSecRole get(long secUserId, long secRoleId) {
    find 'from SecUserSecRole where secUser.id=:secUserId and secRole.id=:secRoleId',
        [secUserId: secUserId, secRoleId: secRoleId]
}

static SecUserSecRole create(SecUser secUser, SecRole secRole, boolean flush = false) {
    new SecUserSecRole(secUser: secUser, secRole: secRole).save(flush: flush, insert: true)
}

static boolean remove(SecUser secUser, SecRole secRole, boolean flush = false) {
    SecUserSecRole instance = SecUserSecRole.findBySecUserAndSecRole(secUser, secRole)
    if (!instance) {
        return false
    }

    instance.delete(flush: flush)
    true
}

static void removeAll(SecUser secUser) {
    executeUpdate 'DELETE FROM SecUserSecRole WHERE secUser=:secUser', [secUser: secUser]
}

static void removeAll(SecRole secRole) {
    executeUpdate 'DELETE FROM SecUserSecRole WHERE secRole=:secRole', [secRole: secRole]
}

}

这是自动生成的控制器:

class SecUserSecRoleController {

static allowedMethods = [save: "POST", update: "POST", delete: "POST"]

def index() {
    redirect(action: "list", params: params)
}

def list(Integer max) {
    params.max = Math.min(max ?: 10, 100)
    [secUserSecRoleInstanceList: SecUserSecRole.list(params), secUserSecRoleInstanceTotal: SecUserSecRole.count()]
}

def create() {
    [secUserSecRoleInstance: new SecUserSecRole(params)]
}

def save() {
    def secUserSecRoleInstance = new SecUserSecRole(params)
    if (!secUserSecRoleInstance.save(flush: true)) {
        render(view: "create", model: [secUserSecRoleInstance: secUserSecRoleInstance])
        return
    }

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

def show(Long id) {
    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: "list")
        return
    }

    [secUserSecRoleInstance: secUserSecRoleInstance]
}

def edit(Long id) {
    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: "list")
        return
    }

    [secUserSecRoleInstance: secUserSecRoleInstance]
}

def update(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: "list")
        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")
            render(view: "edit", model: [secUserSecRoleInstance: secUserSecRoleInstance])
            return
        }
    }

    secUserSecRoleInstance.properties = params

    if (!secUserSecRoleInstance.save(flush: true)) {
        render(view: "edit", model: [secUserSecRoleInstance: secUserSecRoleInstance])
        return
    }

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

def delete(Long id) {
    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: "list")
        return
    }

    try {
        secUserSecRoleInstance.delete(flush: true)
        flash.message = message(code: 'default.deleted.message', args: [message(code: 'secUserSecRole.label', default: 'SecUserSecRole'), id])
        redirect(action: "list")
    }
    catch (DataIntegrityViolationException e) {
        flash.message = message(code: 'default.not.deleted.message', args: [message(code: 'secUserSecRole.label', default: 'SecUserSecRole'), id])
        redirect(action: "show", id: id)
    }
}
}

这意味着 show(Long id) edit(Long id) update(Long id, Long version)delete(Long id) 将不起作用。既然id是复合的,那么如何在controller中获取呢?

我很确定我遗漏了一些明显的东西,这是一个简单的修复,所以如果有人能指出我正确的方向,我将不胜感激!我还在学习如何编码。提前致谢

【问题讨论】:

    标签: java grails spring-security


    【解决方案1】:

    再次 :),这个域类是由 spring-security-plugin 生成的,它的使用不会直接暴露给 web。通常 grails 脚手架不适用于此域类,而仅适用于用户和角色域类,并进行了一些更正。如果您需要管理角色、用户以及用户和角色之间的关系,您可以使用 spring-security-ui-plugin。有了这个插件,你就有了一组视图/控制器,可以帮助你管理 spring-secuirity-plugin。至少如果你想创建你的个人网络界面,而插件是开源的,你可以看到这个插件中使用的控制器是如何工作的。再见

    【讨论】:

      【解决方案2】:

      我认为在这种情况下它应该类似于(对于 show() 方法):

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

      【讨论】:

        猜你喜欢
        • 2014-02-19
        • 2011-12-12
        • 2010-10-20
        • 2013-11-29
        • 2021-06-09
        • 2019-06-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多