我正试图在"创建"视图中设置一个hiddenField,该字段被设置为当前登录用户的id。您可以从"springSecurityService.procent.id"属性中获得。
我想知道是否可以完全从模板中执行此操作,而不是从控制器中传递值。例如
<%@ page import="grails.plugins.springsecurity.SpringSecurityService" %>
<% def springSecurityService %>
<html>
...
...
<g:hiddenField name="user.id" value="${springSecurityService.principal.id}"/>
...
我尝试了这段代码,但最终得到了一个引用"主体"属性的NullPointer异常。
有什么方法可以做到这一点吗?或者我必须从"create"方法显式传递当前登录用户的id吗?
注意:是的,我知道用篡改过的隐藏字段构造POST请求对任何人来说都是微不足道的。控制器代码中有一些检查,以确保当前登录的用户只能创建、编辑和删除自己的帖子。我的问题更多的是不必键入代码来将当前登录的用户传递到三个不同的视图。
尝试使用以下语法
<g:hiddenField name="user.id" value="${sec.loggedInUserInfo(field:"id")}"/>
将当前登录用户的id存储为视图中的隐藏字段是一个非常糟糕的主意,因为任何对web工作原理有基本了解的人都可以用另一个用户的id替换这个值。
相反,您应该使用服务器端的springSecurityService
来获取当前用户。您可以通过域类、控制器、服务、标签库等中的依赖项注入来获得对该服务的引用。
class MyController {
def springSecurityService
def myAction() {
def currentUser = springSecurityService.currentUser
}
}
通过applicationContext:获取安全服务
${applicationContext.springSecurityService.currentUser.id}
<g:hiddenField name="user.id" value="${applicationContext.springSecurityService.currentUser.id}"/>