2012-02-09 82 views
4

我试图设置一个“创建”视图,其中字段设置为当前登录的用户的ID的hiddenField。你从“springSecurityService.principal.id”属性中获得。春季安全核心插件 - 如何从隐藏字段访问用户ID

我想知道是否可以从模板完全做到这一点,而不是从控制器传递值。例如

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

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

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

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

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

回答

13

尝试使用以下语法

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

2年后,但嘿:-)。它是不是会渲染一个带有可能被用户更改的id的隐藏字段,并引入安全风险? – Will 2012-09-03 14:08:37

+0

是的,没错。在用户界面上使用登录用户的ID确实是一个糟糕的主意..我绝不会这么做:) – Saurabh 2012-09-18 02:12:58

+2

如果仅用于确定显示控件,则不是风险。您应该仍然在服务器端使用某种ACL或URL限制 – 2012-10-30 12:45:24

4

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

相反,您应该使用服务器端的springSecurityService来获取curren用户。你可以通过依赖注入在一个领域类,控制器,服务,标签库,参考此服务等

class MyController { 
    def springSecurityService 

    def myAction() { 
    def currentUser = springSecurityService.currentUser 
    } 
} 
+0

是的,我知道Ø f安全影响。我的问题是,我现在必须特别通过当前登录的用户进行“创建”,“保存”,“编辑”,“更新”和“删除”方法。这似乎打败了DRY的原则,并想知道是否有更好的方法来做到这一点。 – srkiNZ84 2012-02-10 00:18:23

+0

@ srkiNZ84 - 我不确定将当前登录的用户传递给方法是什么意思。你可以在这里复制代码吗? – Saurabh 2012-02-10 19:07:57

4

抓斗通过为ApplicationContext securityService:

$ {} applicationContext.springSecurityService.currentUser.id

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