【问题标题】:Controllers in GrailsGrails 中的控制器
【发布时间】: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 */
    ...
  }
}

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

【问题讨论】:

    标签: grails controller grails-orm


    【解决方案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】:

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

                    【讨论】:

                      猜你喜欢
                      • 1970-01-01
                      • 2014-11-28
                      • 2016-07-13
                      • 1970-01-01
                      • 1970-01-01
                      • 1970-01-01
                      • 1970-01-01
                      • 1970-01-01
                      • 1970-01-01
                      相关资源
                      最近更新 更多