Контроллеры в Граале - PullRequest
       80

Контроллеры в Граале

7 голосов
/ 28 января 2009

Я пишу небольшое веб-приложение на Grails, и у меня есть следующий вопрос, касающийся передовых методов проектирования контроллеров и использования GORM:

Я храню пользовательский объект в session.user. В настоящее время все мои методы действия начинаются со следующего кода, чтобы убедиться, что действительный пользователь вошел в систему и что пользовательский объект свежий:

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

Это лучшая практика? Можно ли сделать это лучше и / или более кратко?

Ответы [ 12 ]

9 голосов
/ 28 января 2009

Используйте фильтр , чтобы вы могли поместить этот же повторяющийся код в фильтр и сосредоточить свои контроллеры на реальном действии.

3 голосов
/ 28 января 2009

Я думаю, что целесообразно использовать beforeInterceptor. И немного рассмотрим этот плагин JSecurity . Для аутентификации пользователей плагин jsecurity очень полезен.

1 голос
/ 01 сентября 2014
import grails.plugins.springsecurity.Secured

@ Защищено (['ROLE_ADMIN', 'ROLE_SUB_ADMIN', 'ROLE_USER'])

class DashboardController {

def 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)
}
1 голос
/ 13 июня 2014

Взгляните на Spring Security Core Plugin , который является богатой платформой для целей безопасности. Вы можете использовать метод springSecurityService.isLoggedin() после внедрения структуры, но среда обеспечивает гораздо более точный контроль доступа и привилегий, что также устраняет необходимость в шаблоне.

1 голос
/ 06 мая 2013

Есть много способов Лучше всего использовать фильтр (до) и положить if (! session? .user) { редирект (контроллер: «аутентификация», действие: «авторизация») } этот код в фильтре.

Во-вторых, вы можете использовать плагин безопасности Spring, чтобы вам не приходилось беспокоиться о пользовательских сессиях, он будет автоматически его контролировать. см http://blog.springsource.org/2010/08/11/simplified-spring-security-with-grails/ для дальнейшей информации о плагине

1 голос
/ 23 апреля 2013

Прошли ли вы Spring Security Core .
Это хорошая структура в целях безопасности ..

1 голос
/ 28 января 2009

Я согласен с предложениями других пользователей. Если это не работает для вас, вы можете определить beforeInterceptor на вашем контроллере, чтобы минимизировать также некоторое дублирование.

1 голос
/ 28 января 2009

Вы можете попытаться определить это как фильтр вместо дублирующего кода .

0 голосов
/ 28 декабря 2013

у меня вторая весенняя охрана. Вы пытаетесь изобрести колесо здесь. Все это было сделано для вас и даже больше.

0 голосов
/ 17 декабря 2013

Если вы не ищете полностью безопасный ответ, такой как Spring Security Core, вы можете использовать этот код из документации Grails в качестве фильтра:

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