使用Spring Security无法确保Grails中的流程步骤

时间:2014-01-22 00:19:54

标签: grails spring-security spring-webflow

我正在使用Grails 2.2.2,Spring WebFlow 2.0.0和Spring-Security-Core 2.0-RC2插件。我想确保流程中的最后一步,但一直无法实现。

grails.plugin.springsecurity.interceptUrlMap = [
  '/myController/connect?execution=e*s3': ["isFullyAuthenticated()"]
]

当用户尝试进入流程的最后一步时,如果他们未完全通过身份验证,我想将其重定向到登录页面。这适用于我的项目中的其他操作,而不是webflows。

我发现一些文档表明Spring Web Flows和Spring Security可以一起使用:http://docs.spring.io/spring-webflow/docs/2.0.x/reference/html/ch07s04.html

有什么想法吗?这是Grails的可能吗?

3 个答案:

答案 0 :(得分:2)

在安全检查之前,会从网址中删除查询字符串,因此我认为您需要明确地自行检查。

isFullyAuthenticated()SecurityExpressionRoot的实施是

public final boolean isFullyAuthenticated() {
    return !trustResolver.isAnonymous(authentication) && !trustResolver.isRememberMe(authentication);
}

所以你可以依赖注入authenticationTrustResolver bean并进行相同的检查,例如

class MyController {
   def authenticationTrustResolver
   def springSecurityService

   def action() {

      if (params.execution == 'e*s3' && !isFullyAuthenticated()) {
         response.sendError 401
         return
      }

      ...
   }

   private boolean isFullyAuthenticated() {
      def authentication = springSecurityService.authentication
      !authenticationTrustResolver.isAnonymous(authentication) && !authenticationTrustResolver.isRememberMe(authentication)
   }
}

答案 1 :(得分:2)

或者,您可以这样做:

grails.plugin.springsecurity.interceptUrlMap = [
  '/myController/connect': ["(request.getParameter('execute')?:'').matches('^e.*?s3\$') ? fullyAuthenticated : permitAll"]
]

我们的想法是为表达式公开HttpServletRequest,因此我们可以决定是返回fullyAuthenticated还是返回permitAll。

答案 2 :(得分:0)

你不能只导入这个类,并为你的用户添加带有matchin角色的注释到你的step方法吗?

import grails.plugins.springsecurity.Secured

class MyClass() {

    @Secured(['ROLE_USER'])
    def lastStep() {
        // do things
    }

}

未经过身份验证的用户将被重定向到登录页面