Почему аннотации @Secured не будут работать после ручного входа в систему безопасности grails? - PullRequest
0 голосов
/ 04 апреля 2011

Я пытался войти в систему пользователя автоматически после успешной регистрации с использованием Grails с плагином Spring-security-core. Хотя принудительный вход в систему работает, а все права доступа и т. Д. Загружены, аннотации @Secured в других контроллерах не распознают предоставленные права доступа, и, следовательно, браузер застревает в цикле перенаправления между защищенной страницей и страницами входа в систему.

Мой логин:

def forceLogin = {
  PSysuser sysuser = flash.sysuser;
  String username = flash.username ?: params.username;
  String password = flash.password ?: params.password;
  UsernamePasswordAuthenticationToken token = new UsernamePasswordAuthenticationToken(
      sysuser?.username ?: username,
      sysuser?.password ?: password
  );
  request.session;
  token.details = new WebAuthenticationDetails(request);
  Authentication authenticatedUser = authenticationManager.authenticate(token);
  SecurityContextHolder.context.authentication = authenticatedUser;
  springSecurityService.reauthenticate(username, password); //doesn't appear to work, but doesn't hurt either.
  redirect action:auth;
}

Кто-нибудь знает, как я могу заставить аннотации работать правильно?

Ответы [ 2 ]

1 голос
/ 04 апреля 2011

Если вы используете плагин spring-security, взгляните на некоторые из вспомогательных классов .Более конкретно, проверьте метод повторной аутентификации SpringSecurityService.Вот пример из удивительной документации Берта:

class UserController {
   def springSecurityService

   def update = {
      def userInstance = User.get(params.id)

      params.salt = person.salt
      if (userInstance.password != params.password) {
         params.password = springSecurityService.encodePassword(params.password, salt)
         def salt = … // e.g. randomly generated using some utility method
         params.salt = salt
      }
      userInstance.properties = params
      if (!userInstance.save(flush: true)) {
         render view: 'edit', model: [userInstance: userInstance]
         return
      }

      if (springSecurityService.loggedIn &&
             springSecurityService.principal.username == userInstance.username) {
         springSecurityService.reauthenticate userInstance.username
      }

      flash.message = "The user was updated"
      redirect action: show, id: userInstance.id
   }
}
0 голосов
/ 08 апреля 2011

Итак, оказывается, что это были не аннотации @Secured, а код аутентификации на основе сеансов, оставшийся до внедрения Spring-Security. После добавления правильного объекта в область сеанса проблема исчезла.

ARGH!

...