Grails登录用户名拥有已创建的记录

时间:2012-11-23 21:35:45

标签: grails spring-security

我确信这必须是编程中最常见的事情之一,即如何将某个表单提交与某个登录用户相关联。

我已经尝试了相当长的一段时间,我最终只是在圈子里跑,并在出错后得到错误。

我的问题是,让用户拥有他们提交的记录的正确方法是什么?

我尝试了很多选项,但未成功。 :\我甚至尝试了一种不太安全的创建String字段的方法,并将当前用户插入gsp的隐藏字段中,甚至无法正常工作。

static belongsTo =用户

在域类中,很棒,但只允许我在用户表单中看到它。

也许问题在于它是如何支撑的。生成控制器,生成视图为所有记录执行一个很好的通用列表。我需要此列表才能显示他们的记录。但另外我需要我的管理员才能看到所有记录。

任何人都可以帮我指出正确的方向吗?

SalesOrderController.groovy

@Secured(['IS_AUTHENTICATED_REMEMBERED'])
def list(Integer max) {     

    params.max = Math.min(params.max ? params.max.toInteger() : 10, 100)
    [salesOrderInstanceList: SalesOrder.list(params), salesOrderInstanceTotal: SalesOrder.count()]
//      def user = params.id ? SecUser.findByUsername(params.id) : SecUser.get(springSecurityService.principal.id)
//      [salesOrderInstanceList: SalesOrder.findAllBySoldBy(user), salesOrderInstanceTotal: SalesOrder.count()]
//      if (!user) {
//          response.sendError(404)
//          return
//      }
}

类SalesOrder {

static searchable = {
    user(component:true)
}

enum JobStatus {
    PENDING, APPROVED, COMPLETE
}

enum JobType {
    INSTALL, REPAIR, WARRANTY, TINT
}

enum PaymentType {
    INSURANCE, CASH
}

enum InstallLocation {
    INSHOP, HOME, BUSINESS
}

enum InstallTime {
    MORNING, MIDDAY, AFTERNOON
}

JobStatus jobStatus
JobType jobType
PaymentType paymentType

String custFirstName
String custLastName
String custBestNumber
String custAlternateNumber
String custEmail
String custAddress
String custAddress2
String custCity
String custState
String custZip

String vehicleYear
String vehicleMake
String vehicleModel
String vehicleVin

static hasMany = [glassTypes: GlassType, options: GlassOption]

Date insuranceDateOfLoss
String insuranceCompany
String insurancePolicyNumber
String insuranceClaimNumber
String insuranceDeductible

Date installDate
InstallTime installTime
InstallLocation installLocation
String installCrossStreet1
String installCrossStreet2
String installAddress
String installCity

String notes

Date dateCreated
String soldBy


static constraints = {

    jobType blank: false
    custFirstName blank: false
    custLastName blank: false
    custBestNumber blank: false, size:10..10
    custAlternateNumber nullable: true, sizeMax: 10
    custEmail blank: false, email: true
    custAddress blank: false
    custAddress2 nullable: true
    custCity blank: false
    custState blank: false, size: 2..2
    custZip blank:false, size: 5..5

    vehicleYear blank: false, size:4..4
    vehicleMake blank: false
    vehicleModel blank: false
    vehicleVin blank: false, size:17..17

    glassTypes blank: false
    options blank: false

    insuranceDateOfLoss nullable: true
    insuranceCompany nullable: true
    insurancePolicyNumber nullable: true
    insuranceClaimNumber nullable: true
    insuranceDeductible nullable: true

    installDate blank: false
    installTime blank: false
    installLocation blank: false
    installCrossStreet1 blank: false
    installCrossStreet2 blank: false
    installAddress nullable: true
    installCity nullable: true

    paymentType blank: false
    jobStatus blank: false
    notes nullable: true, size:0..1024
    soldBy blank: false     
}

static belongsTo = SecUser

}

<div class="fieldcontain ${hasErrors(bean: salesOrderInstance, field: 'soldBy', 'error')} required">
<label for="soldBy">
    <g:message code="salesOrder.soldBy.label" default="Sold By" />
</label>
<g:textField name="soldBy" value="${salesOrderInstance?.soldBy}" default="${sec.loggedInUserInfo(field:'username')}" />
<sec:loggedInUserInfo field="username"></sec:loggedInUserInfo>

我尝试了一个使用服务的示例,但这只是让我迷失了,因为示例只需要传递一个字段。正如你所看到的,我有不止一个,还有一些多对一的连接。给我留下的问题多于答案。

1 个答案:

答案 0 :(得分:2)

关于用户查看自己的数据与管理员查看每个人的数据的问题,see my answer to a similar question here

至于将用户与他们自己的数据相关联......如果数据属于用户,只需将用户域与所述数据相关联,就像您已经完成的那样,但稍作修改:

class SalesOrder {

   static belongsTo = [secUser : SecUser]

}

然后将适当的映射添加到您的SecUser类:

class SecUser {

   static hasMany = [salesOrders : SalesOrder]

}

然后,当您将数据发布到服务器时:

@Secured(['IS_AUTHENTICATED_REMEMBERED'])
def save() {

   def authenticatedUser = SecUser.findByUsername(springSecurityService.principal.username)
   def salesOrder = new SalesOrder(params)
   // this assumes you're SecUser and SalesOrder are a 1-to-many bidirectional association
   authenticatedUser.addToSalesOrders(salesOrder)
   authenticatedUser.save()
}

由于控制器中有相同的数据,因此无需将信息存储在隐藏字段中。脚手架是开始概念验证的好方法。但是,我再也不会使用脚手架了。

相关问题