1

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

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

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

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

4

4 回答 4

1

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

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

如果不了解您在做什么的更多细节,很难说,但我可以看到一些选项

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

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

根据评论进行编辑

首先,如果您使用的是 Spring Security 插件,您可以轻松获取当前用户
如果你走这条路,你需要将安全服务注入你想要获取用户的每个控制器/服务中。

其次,如果您不是,您应该编写一个SessionHelper带有静态方法的类,以帮助将所有会话操作代码保存在一个地方(Spring Security 也有这样的助手)。如果您这样做,则可以随时随地获取当前用户。

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

于 2012-08-20T20:05:48.450 回答
0

如果确实每个对象都需要绑定到用户,您可以修改控制器模板以包含所需的代码。

于 2012-08-20T19:08:04.887 回答
0

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

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

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

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

于 2012-08-22T12:26:03.147 回答
0

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

于 2012-08-20T20:12:40.700 回答