2009-01-27 148 views
7

我写Grails的小web应用程序和我有任何关于控制器设计的最佳实践,并使用GORM以下问题:控制器Grails中

我存储在session.user用户对象。目前,所有我的操作方法用下面的代码开始,以确保有效的用户登录和用户对象是刚:

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

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

回答

9

使用filter,这样你可以把相同的重复代码放在过滤器中,并让你的控制器集中在真实的动作上。

+0

不会过滤引入“隐藏”的代码,这对后来读取代码的开发人员来说并不是很明显? – 2014-03-23 09:39:38

1

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

3

我认为使用beforeInterceptor是appropriate.And给一些看这个JSecurity plugin。对于用户认证jsecurity插件是非常有用的。

1

有很多方法 更好的方法是使用过滤器(前),并把 如果(会话。用户!?){ 重定向(控制器:“认证”,动作: “login”) } 此代码在过滤器中。

第二件事你可以使用spring安全插件,这样你就不用担心用户会话会自动控制它。 看到http://blog.springsource.org/2010/08/11/simplified-spring-security-with-grails/ 之进一步资料插件

0

使用Spring Security Core ....图..角色而安装插件配置相同的...不要忘记,以创建引导管理员用户...

+0

该问题与最佳做法有关,或者以更好的方式进行。请详细说明为什么这是使用Spring Security Core的最佳实践/更好的方式 – kgdesouz 2013-06-15 15:29:21

+0

以下是我能想到的几个优点: 1.使用Spring Security为我们提供了经过充分测试的强大功能代码安全管理。 2.我们得到了springSecurityService类,它有许多有用的方法,包括getCurrentUser()。因此,我们不需要自己做。 – 2014-06-25 18:02:39

0

如果你是不是在找一个完全安全的答案,就像Spring Security的核心,您可以使用此代码从Grails文档作为过滤器:

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

我第二次春季安全。你正试图在这里重新发明轮子。所有这些都是为您和更多人完成的。

1

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

1
import grails.plugins.springsecurity.Secured 

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

类DashboardController {

DEF创建(){

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