我正在尝试在“创建”视图中设置hiddenField,其中该字段设置为当前登录用户的ID。您从“springSecurityService.principal.id”属性获得的。
我想知道是否可以从模板中专门执行此操作,而不是从控制器传递值。 e.g。
<%@ page import="grails.plugins.springsecurity.SpringSecurityService" %>
<% def springSecurityService %>
<html>
...
...
<g:hiddenField name="user.id" value="${springSecurityService.principal.id}"/>
...
我尝试了这段代码,但最终在引用“principal”属性时获得了NullPointer异常。
有没有办法做到这一点,还是我必须从“创建”方法中明确传递当前登录用户的ID?
注意:是的我知道任何人都可以使用doctored隐藏字段构建POST请求。控制器代码中有检查以确保当前登录的用户只能创建,编辑,删除自己的帖子。我的问题更多的是不必输入代码将当前登录的用户传递给三个不同的视图。
答案 0 :(得分:13)
尝试使用以下语法
<g:hiddenField name="user.id" value="${sec.loggedInUserInfo(field:"id")}"/>
答案 1 :(得分:4)
将当前登录用户的id作为隐藏字段存储在视图中是一个非常糟糕的主意,因为任何具有Web工作原理基础知识的人都可以将该值替换为另一个用户的ID。
相反,您应该使用服务器端的springSecurityService
来获取当前用户。您可以通过域类,控制器,服务,taglib等中的依赖注入来获取对此服务的引用。
class MyController {
def springSecurityService
def myAction() {
def currentUser = springSecurityService.currentUser
}
}
答案 2 :(得分:4)
通过applicationContext:
获取securityService$ {applicationContext.springSecurityService.currentUser.id}
<g:hiddenField name="user.id" value="${applicationContext.springSecurityService.currentUser.id}"/>