如何在不使用`generate controller`的情况下确保模型与当前用户绑定?

时间:2012-08-20 17:20:16

标签: grails grails-controller

我正在尝试创建我的第一个Grails应用程序,并且我发现许多域模型需要绑定到当前用户。例如,创建的评论必须由当前用户拥有,保存的配置文件和&编辑必须是当前用户等。

我开始使用generate controller并每次都插入必要的代码。但是,这通常是我目前对这些控制器进行的唯一更改,每次都是相同的控制器。必须有一种更优雅的方式,感觉更“粗暴”。

到目前为止,我提出的最好的想法是将必须与当前用户绑定的字段命名为每个模型中完全相同的内容(例如originatingUser),然后在{{1}上使用过滤器将当前设置为before的内容覆盖到originatingUser中存储的当前User

这种方法有缺陷吗?还有更好的东西吗?

4 个答案:

答案 0 :(得分:1)

  

我开始使用generate controller并插入必要的代码   每一次。但是,这通常是我目前唯一的变化   每次都对那些控制器及其相同的控制器。必须有一个   更优雅的方式感觉更“粗鄙”。

无论您做什么,都不要在任何地方复制/粘贴代码。这与Grails无关。只是不要这样做。每次你这样做,上帝都会杀死一只小猫。

如果不了解有关您正在做的事情的详细信息,很难说,但我可以看到一些选项

1)如果您需要将实体保留在数据库之外,一旦加载它们,您就可以将它们与用户一起放入会话中。您可以在基本控制器类中编写代码来访问会话以检索“当前”模型实例,然后让所有控制器扩展该控制器。或者您可以选择将会话访问代码放在某种帮助程序中。

2)1的问题是它不能很好地扩展。如果你需要保留很多物体,我不会把它们放在会话中。在这种情况下,您需要查看您的设计。你真的需要在会话中保留实例吗?如果要检查用户是否拥有正在修改的对象,则可以将该检查放入服务方法中。因此,如果您检查编辑,服务应该做的第一件事是检查用户a)是否具有修改实例所必需的角色(如果您使用的是安全性),以及b)检查用户是否拥有该实例(或者可以修改它)。

基于评论的编辑

首先,如果您使用的是Spring Security插件,则可以获得current user easily 如果你走这条路,你需要将安全服务注入你想要获得用户的每个控制器/服务。

其次,如果你不是,你应该写一个SessionHelper类,其上有静态方法,以帮助将所有会话操作代码保存在一个地方(Spring Security也有这样的帮助器)。如果你这样做,那么只要你想要的话就可以获得当前用户。

最后,您应该在服务层中获取用户。服务应该对持久化实例进行所有操作。如果用户只能连接到他们自己的项目,这也有助于以某种方式让某个特定事物的错误用户出现错误。

答案 1 :(得分:0)

如果确实需要将每个对象绑定到用户,则可以修改Controller模板以包含所需的代码。

答案 2 :(得分:0)

您是否计划推出自己的安全机制?查看Spring Security插件(或类似插件)可能更有用。查看是否可以修改Controller模板以加快该过程。在那些初始迭代之后,你真的应该尝试保存一些小猫。

答案 3 :(得分:0)

  

我到目前为止提出的最好的想法是将必须与当前用户绑定的字段命名为每个模型中的完全相同的东西(例如originatingUser),然后在之前使用过滤器来覆盖当前设置的任何内容作为OriginatingUser到存储在会话中的当前用户。

     

这种方法有缺陷吗?还有更好的东西吗?

您可以使用另一种更复杂的方法:AST转换,注释等,但这是一种简单有效的方法。

顺便问一下,您使用的是Spring Core Security插件吗?