Spring安全核心插件 - 如何从隐藏字段访问用户ID

srk*_*Z84 4 grails spring-security gsp grails-plugin hiddenfield

我正在尝试在"创建"视图中设置hiddenField,其中该字段设置为当前登录用户的ID.您从"springSecurityService.principal.id"属性获得的属性.

我想知道是否有可能只从模板中执行此操作,而不是从控制器传递值.例如

<%@ page import="grails.plugins.springsecurity.SpringSecurityService" %>
<% def springSecurityService %>

<html>
...
...
<g:hiddenField name="user.id" value="${springSecurityService.principal.id}"/>
...
Run Code Online (Sandbox Code Playgroud)

我尝试了这段代码,但最终得到了一个引用"principal"属性的NullPointer异常.

有没有办法做到这一点,还是我必须从"创建"方法显式传递当前登录用户的ID?

注意:是的我知道任何人使用doctored隐藏字段构造POST请求都是微不足道的.控制器代码中有检查以确保当前登录的用户只能创建,编辑,删除自己的帖子.我的问题更多的是不必输入代码将当前登录的用户传递给三个不同的视图.

Sau*_*abh 13

尝试使用以下语法

<g:hiddenField name="user.id" value="${sec.loggedInUserInfo(field:"id")}"/>
Run Code Online (Sandbox Code Playgroud)

  • 如果它仅用于确定是否显示控件,则不存在风险.您仍应在服务器端使用某种ACL或URL限制 (2认同)

Dón*_*nal 5

在视图中将当前登录用户的ID存储为隐藏字段是一个非常糟糕的主意,因为任何具有Web工作原理的基本知识的人都可以用另一个用户的ID替换该值。

相反,您应该springSecurityService在服务器端使用来获取curren用户。您可以通过域类,控制器,服务,taglib等中的依赖项注入获得对该服务的引用。

class MyController {
  def springSecurityService

  def myAction() {
    def currentUser = springSecurityService.currentUser
  }
}
Run Code Online (Sandbox Code Playgroud)