【问题标题】:Grails, call controller method in gsp, set default user in formGrails,在gsp中调用控制器方法,在表单中设置默认用户
【发布时间】:2015-05-05 15:24:21
【问题描述】:

我正在使用 Spring Security 核心插件实现身份验证。现在我有一个生成 CRUD 视图的类,我想调整它们。

域类的一部分是用户。如果用户只有“用户权限”,他不应该选择用户(默认用户是当前用户)。 如果用户是管理员(权限:ROLE_ADMIN),他应该能够选择所有可用用户。

在我的控制器中,我尝试使用 springSecurityService.getCurrentUser() 在我的 gsp 中设置默认用户。不幸的是,这会导致错误:

控制器:

def currentUser(){
        User user = springSecurityService.getCurrentUser()
        return user
    }

form.gsp:

<div class="fieldcontain ${hasErrors(bean: daybookingInstance, field: 'user', 'error')} required">
    <label for="user">
        <g:message code="daybooking.user.label" default="User" />
        <span class="required-indicator">*</span>
    </label>
    <g:select id="user" name="user.id" from="${usermanagement.User.list()}" optionKey="id" required="" value="${package.controller.currentUser().id}" class="many-to-one"/>

到底怎么让selection的内容变变量(admin:所有用户,普通用户:不选择)以及如何设置默认用户(当前登录)

编辑:错误信息:

Caused by MissingMethodException: No signature of method: usermanagement.User.currentUser() is applicable for argument types: () values: []
Possible solutions: currentUser()

编辑:

这是我在控制器中的方法:

User userInstance = springSecurityService.getCurrentUser()
        integer id = userInstance.id
        log.error(id)
        render(view: '_form.gsp', model : [id: id])

    }

我尝试通过传递整个 userInstance 但我总是得到一个空指针异常,说我无法从 null 获取 id(在视图中:userInstance.id)

这是我认为的sn-p(由grails创建的_form.gsp):

<div class="fieldcontain ${hasErrors(bean: dailyBookingInstance, field: 'user', 'error')} required">
    <label for="user">
        <g:message code="dailyBooking.user.label" default="User" />
        <span class="required-indicator">*</span>
    </label>
    <g:select id="user" name="user.id" from="${usermanagement.User.list()}" optionKey="id" required="" value="${id}" class="many-to-one"/>

</div>

这些方法工作正常,因为 id/userInstance 已正确记录。不知何故,我觉得我不应该将数据传递给这个生成的东西。

【问题讨论】:

  • 你能详细说明一下这段代码:`value="${package.controller.currentUser().id}"`吗?我猜您尝试从 gsp 调用控制器方法,对吗?如果是这样,这不是它的工作方式。控制器渲染视图并将值传递给视图,而不是相反。另一件事是,如果您想从 gsp 读取当前用户,则有一个 spring security taglib 用于此(参见docs)。
  • 是的,我想从 gsp 调用控制器方法。但你是对的,这不是它的工作原理。我加了smth。就像在我的控制器中那样:[用户:用户],这应该将用户对象传递给视图吗?现在的问题是当我尝试在视图中访问它时,我总是得到它为空的错误。生成的 CRUD 视图有问题吗?目前我在 _form.gsp 中工作,并在我的控制器中有一个名为 currentUser() 的操作。
  • 下一段代码是什么意思:usermanagement.User.list() ??
  • 这是从 grails/gorm 生成的,结果是一个包含所有用户的下拉菜单
  • 可能usermanagement只是User Domain类的封装...

标签: grails view controller grails-orm


【解决方案1】:

编辑:要将用户从控制器传递到视图,请执行以下操作。

def controllerAction()
{
    //get the user instance
    User userInstance = springSecurityService.currentUser;

    //pass the user to your view
    render(view: 'theviewname', model : [userInstance: userInstance])
}

然后您可以使用 ${userInstance} 访问视图中的 userInstance

您可以使用 Spring Security 标签库。

例如:

<sec:ifAllGranted roles="ROLE_ADMIN,ROLE_SUPERVISOR">secure stuff here</sec:ifAllGranted>

您可以查看here 的各种可用选项。

【讨论】:

  • 是的,我看到了,但我不认为 taglib 涵盖了所有内容?看不到如何根据用户(管理员或用户)中的当前登录名在
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-03-07
  • 2017-12-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-01-02
相关资源
最近更新 更多