在grails spring-security手册登录后,为什么@Secured注释不起作用?

时间:2011-04-04 00:00:17

标签: grails annotations spring-security

我一直尝试使用带有spring-security-core插件的grails成功注册后自动登录用户。当强制登录工作,并且所有权限等都被加载时,其他控制器中的@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 个答案:

答案 0 :(得分:1)

如果您使用的是spring-security-plugin,请查看一些helper classes。更具体地说,请查看SpringSecurityService的reauthenticate方法。以下是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
   }
}

答案 1 :(得分:0)

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

哎呀!