为什么赢了';t@Secured注释在GrailsSpring安全性手动登录后是否工作?

为什么赢了';t@Secured注释在GrailsSpring安全性手动登录后是否工作?,grails,annotations,spring-security,Grails,Annotations,Spring Security,我一直在尝试使用grails with spring security core插件成功注册后自动登录用户。当强制登录有效,并且加载了所有权限等时,其他控制器中的@Secured注释将无法识别授予的权限,因此浏览器会在安全页面和登录页面之间陷入重定向循环 我的登录操作: def forceLogin = { PSysuser sysuser = flash.sysuser; String username = flash.username ?: params.username; St

我一直在尝试使用grails with 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;
}

有人知道如何让注释正常工作吗?

如果您使用的是spring安全插件,请查看一些注释。更具体地说,请查看SpringSecurityService的重新验证方法。下面是Burt惊人的文档中的一个示例:

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

因此,原来根本不是@Secured注释,而是spring安全性实现之前遗留下来的基于会话的身份验证代码。 将正确的对象添加到会话范围后,问题就消失了


但这正是问题所在,所有Spring Security helper类似乎都能识别身份验证和用户详细信息,但当用户尝试访问@Secured控制器时,它会将其返回到登录,从而创建重定向循环。正常登录工作正常,所以我必须错过一个j_spring_security_check没有的步骤。我可以,但它不会帮助任何人。该解决方案是特定于实现的,因为它是针对遗留代码的黑客攻击。我所做的所有手动身份验证工作都基于上面的内容。你是否有与我描述的问题类似的问题?是的。在grails 2.0.0和HTTPS中,在调用“重新验证”后更新了用户详细信息,但被拒绝的URL导致HTTP 310错误:重定向太多,注销无效。清除cookies可以帮助我重新登录。我使用强制注销而不是重新验证。但我想使用“重新验证”功能!