Grails中的控制器

7
我是一名能够翻译文本的助手。

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

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

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

这是最佳实践吗?是否有更好或更简洁的方法来完成它?

12个回答

9
使用过滤器,这样您可以将相同的重复代码放在过滤器中,并使您的控制器专注于真正的操作。 (参考链接)

过滤器是否会引入“隐藏”的代码,使得后来阅读代码的开发人员无法立即发现? - Alexander Suraphel

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

1

有很多种方法,更好的方法是使用过滤器(before),并放置以下代码:

if (!session?.user) {
  redirect(controller: "authentication", action: "login")
}

如果您担心用户会话,第二个选择是使用Spring安全插件。它将自动控制用户会话。请参阅http://blog.springsource.org/2010/08/11/simplified-spring-security-with-grails/获取有关插件的更多信息。


1

1
请查看 Spring Security Core Plugin,它是一个丰富的安全框架。在注入该框架后,您可以使用 springSecurityService.isLoggedin() 方法,但该框架还提供了更细致的访问和权限控制,避免了样板文件的需要。

我相信你已经有了一个不错的起点。请考虑增加更多支持性的评论和参考资料来进一步完善它。 - SQLMason

1

1

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


1
import grails.plugins.springsecurity.Secured

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

类DashboardController{

定义create() {

    [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)
}

0

如果您不需要完全安全的答案,例如Spring Security Core,可以使用Grails文档中提供的此代码作为过滤器:

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

0

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接