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

Posted

技术标签:

【中文标题】Spring 安全核心插件 - 如何从隐藏字段访问用户 ID【英文标题】:Spring security core plugin - How to access User id from a hidden field 【发布时间】:2012-03-01 18:58:49 【问题描述】:

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

我想知道是否可以完全从模板中执行此操作,而不是从控制器传递值。例如

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

<html>
...
...
<g:hiddenField name="user.id" value="$springSecurityService.principal.id"/>
...

我尝试了这段代码,但最终得到了一个引用“主体”属性的 NullPointer 异常。

有什么方法可以做到这一点,还是我必须从“create”方法中显式传递当前登录用户的 id?

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

【问题讨论】:

【参考方案1】:

尝试使用以下语法

<g:hiddenField name="user.id" value="$sec.loggedInUserInfo(field:"id")"/>

【讨论】:

晚了 2 年,但是嘿 :-)。它不会呈现一个隐藏字段,其 id 可能会被用户更改并引入安全风险吗? 是的..没错。在 UI 上使用登录用户的 ID 确实是个坏主意。我永远不会那样做 :) 如果只是用来判断是否显示控件是没有风险的。您仍然应该在服务器端使用某种 ACL 或 URL 限制 +1 杰森。 “暴露用户 id 存在安全风险”相当于“暴露 url 中的亚马逊产品 id 存在安全风险”【参考方案2】:

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

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

class MyController 
  def springSecurityService

  def myAction() 
    def currentUser = springSecurityService.currentUser
  

【讨论】:

是的,我知道安全隐患。我的问题是我现在必须专门为“创建”、“保存”、“编辑”、“更新”和“删除”方法传递当前登录的用户。这似乎违背了 DRY 的原则,并且想知道是否有更好的方法来做到这一点。 @srkiNZ84 - 我不确定将当前登录用户传递给方法是什么意思。你能把代码复制到这里吗?【参考方案3】:

通过 applicationContext 获取 securityService:

$applicationContext.springSecurityService.currentUser.id

<g:hiddenField name="user.id" value="$applicationContext.springSecurityService.currentUser.id"/>

【讨论】:

以上是关于Spring 安全核心插件 - 如何从隐藏字段访问用户 ID的主要内容,如果未能解决你的问题,请参考以下文章

在 Grails Spring 安全核心插件中配置了两次 Spring 安全核心框架

Groovy:使用 Grails 和 Spring 安全核心插件时出现意外令牌

如何从控制器调用身份验证 - 弹簧安全核心插件

是否有一种简单或正确的方法来删除spring安全插件?

Grails Spring Security 核心插件

如何保护隐藏字段数据不被更改