java - Grails和Spring Security如何在 Controller 中获取复合ID?

标签 java grails spring-security

这是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]
}

}

这是自动生成的 Controller :

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 (长 ID) 不起作用。既然id是复合的,那么如何在 Controller 中获取它呢?

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

最佳答案

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

关于java - Grails和Spring Security如何在 Controller 中获取复合ID?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21302618/

相关文章:

java - 这个Java算法如何更快

java - 不可编辑的 jTextField 在按删除键时发出错误声音,如何解决?

java - 跳过 ZipInputStream 中的多个字节

java - 如何在mysql中选择表的列名,列数据类型,关键列

java - 在 Spring 中使用 BCryptPasswordEncoder 检索密码盐

grails - 名称查询日期

grails - application.yml 中的 server.session.timeout 在作为 war 部署到 tomcat 时不使用

grails - Grails动态 “inList”

java - Spring 安全要求和问题

java - 无状态 spring 应用程序 - JSESSIONID 仍然生成