Как передать идентификатор зарегистрированного пользователя выбранному контроллеру в граалях с помощью acegi? - PullRequest
0 голосов
/ 13 января 2010

Я защитил свое приложение Grails с помощью плагина ACEGI и использую аннотации к моим методам контроллера, чтобы предложить пользователю войти в систему.

Мое приложение имеет статическую HTML-страницу с ссылкой для входа в систему, которая перенаправляет на страницу login/auth. При успешном входе в систему я хочу загрузить собственную пользовательскую страницу для аутентифицированного пользователя с именем person/mainpage.

В моем LoginController есть следующий код ...

def index = {
    if (isLoggedIn()) {
        redirect uri: '/'
    }
    else {
        redirect action: auth, params: params
    }
}

/**
 * Show the login page.
 */
def auth = {

    nocache response

    if (isLoggedIn()) {
        redirect uri: '/'
        return
    }

    String view
    String postUrl
    def config = authenticateService.securityConfig.security
    if (config.useOpenId) {
        view = 'openIdAuth'
        postUrl = "${request.contextPath}/login/openIdAuthenticate"
    }
    else if (config.useFacebook) {
        view = 'facebookAuth'
        postUrl = "${request.contextPath}${config.facebook.filterProcessesUrl}"
    }
    else {
        view = 'auth'
        postUrl = "${request.contextPath}${config.filterProcessesUrl}"
    }

    render view: view, model: [postUrl: postUrl]
}

Это перенаправляет успешный вход обратно на главную страницу приложения (/), а это не то, что я хочу. Погуглив некоторое время, я обнаружил, что могу определить цель по умолчанию для своей аутентификации в securityconfig.groovy, как это ..

defaultTargetUrl = "/person/mainpage"

Мой вопрос заключается в том, как определить, какой пользователь вошел в систему, когда я выполняю свое действие mainpage в моем PersonController?

Сначала я изменил свое действие индексации в LoginController, чтобы перенаправить на мою страницу следующим образом ...

def index = {
    if (isLoggedIn()) {
        redirect controller: person, action: mainpage, params: params 
    }
    else {
        redirect action: auth, params: params
    }
}

, но идентификатор зарегистрированного пользователя не появляется в params (что, я думаю, меня устраивает, потому что кажется невероятным возможность поднимать страницы, просто определяя идентификатор строки пользователя в качестве параметра URL) .

Так, как правильно это сделать? По сути, я хочу, чтобы мое действие person/mainpage могло разрешить текущего пользователя, вошедшего в систему.

1 Ответ

2 голосов
/ 13 января 2010

Вы можете получить доступ к зарегистрированному пользователю, используя authenticateService. Чтобы получить экземпляр домена пользователя / персоны, вызовите authenticateService.userDomain () и просто получите аутентификацию (в которой есть метод getUsername (), которого может быть достаточно), вызовите authenticateService.principal (). Если ваш defaultTargetUrl равен "/ person / mainpage", то действие "mainpage" вашего PersonController будет выглядеть примерно так:

class PersonController {

   def authenticateService

   def mainpage = {
      def user = authenticateService.userDomain()
      if (user) {
         log.info "you're logged in as $user.username"
      }
      else {
         log.info "you're not logged in"
      }
      [user: user]
   }
}

и тогда у вас будет «user», доступный в mainpage.gsp для рендеринга данных из.

...