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 注释