Grails 中的控制器

Posted

技术标签:

【中文标题】Grails 中的控制器【英文标题】:Controllers in Grails 【发布时间】:2009-01-27 21:57:28 【问题描述】:

我正在 Grails 中编写一个小型 web 应用程序,我有以下关于控制器设计和使用 GORM 的最佳实践的问题:

我将用户对象存储在 session.user 中。目前,我所有的操作方法都以以下代码开头,以确保有效用户已登录并且用户对象是新鲜的:

class FooController 
  def actionMethodThatRequiresAValidUser = 
    if (!session?.user) 
      redirect(controller: "authentication", action: "login")
    
    session.user.refresh()
    ...
    /* do stuff */
    ...
  

这是最佳做法吗?能否以更好和/或更简洁的方式完成?

【问题讨论】:

【参考方案1】:

使用filter,这样您就可以将相同的重复代码放入过滤器中,并使您的控制器专注于实际操作。

【讨论】:

过滤器是否不会引入“隐藏”代码,开发人员以后阅读代码时不会立即看到这些代码?【参考方案2】:

我认为使用 beforeInterceptor 是合适的。看看这个JSecurity plugin。对于用户身份验证,jsecurity 插件非常有用。

【讨论】:

【参考方案3】:

您可以尝试将其定义为filter 而不是duplicating code。

【讨论】:

【参考方案4】:

我同意其他人提出的过滤建议。如果这对你不起作用,你可以在你的控制器上定义一个 beforeInterceptor 以尽量减少一些重复。

【讨论】:

【参考方案5】:

你有没有经过Spring Security Core. 这是一个很好的安全框架..

【讨论】:

【参考方案6】:

有很多方法 更好的方法是使用过滤器(之前)并放 如果(!会话?。用户) 重定向(控制器:“身份验证”,操作:“登录”) 此代码在过滤器中。

第二件事你可以使用 spring 安全插件,这样你就不必担心用户会话它会自动控制它。 见http://blog.springsource.org/2010/08/11/simplified-spring-security-with-grails/ 有关插件的更多信息

【讨论】:

【参考方案7】:

看看Spring Security Core Plugin,它是一个用于安全目的的丰富框架。您可以在注入框架后使用springSecurityService.isLoggedin() 方法,但框架提供了更精细的访问和权限控制,同时也避免了对样板的需要。

【讨论】:

我相信你有一个好的答案。请考虑通过提供更多支持性评论和参考来开发它。【参考方案8】:
import grails.plugins.springsecurity.Secured

@Secured(['ROLE_ADMIN', 'ROLE_SUB_ADMIN', 'ROLE_USER'])

类仪表板控制器

定义创建()

    [bankInstance: new Bank(params)]



def save() 
    def bankInstance = new Bank(params)
    if (!bankInstance.save(flush: true)) 
        render(view: "create", model: [bankInstance: bankInstance])
        return
    

    flash.message = message(code: 'default.created.message', args: [message(code: 'bank.label', default: 'Bank'), bankInstance.id])
    redirect(action: "show", id: bankInstance.id)

【讨论】:

【参考方案9】:

你也可以试试apache shiro plugin for grails

【讨论】:

【参考方案10】:

使用Spring Security Core....映射系统中用法(用户)的角色..在安装插件时配置相同...并且不要忘记在引导程序上创建管理员用户...

【讨论】:

问题与最佳实践或以更好的方式进行有关。请详细说明为什么使用Spring Security Core 这是最佳实践/更好的方法 以下是我能想到的几个优点: 1. 使用 Spring Security 为我们提供了经过良好测试的安全管理代码的强大功能。 2.我们得到了springSecurityService类,它有很多有用的方法,包括getCurrentUser()。因此,我们不需要自己做。【参考方案11】:

如果您不是在寻找完全安全的答案,例如 Spring Security Core,您可以使用 grails 文档中的以下代码作为过滤器:

class SecurityFilters 
   def filters = 
       loginCheck(controller:'*', action:'*') 
           before = 
              if(!session.user && !actionName.equals('login')) 
                  redirect(action:'login')
                  return false
               
           
       
   

【讨论】:

【参考方案12】:

我第二春安。您正试图在这里重新发明***。所有这一切都已为您和更多人完成。

【讨论】:

以上是关于Grails 中的控制器的主要内容,如果未能解决你的问题,请参考以下文章

Grails 3.0.2 无法解析控制器中的@Secured 注释

如何从 Grails 中的控制器访问域属性?

Grails 控制器中的异常处理

简单 grails 控制器单元测试中的空指针

Grails:在控制器中设置啥以达到 URL 映射中的错误处理?

如何从grails中的控制器调用服务