Grails 3 Spring Security Pre Authentication

时间:2016-04-26 12:31:12

标签: grails spring-security

我在工作中使用的应用程序使用Grails 3.我正在尝试执行预身份验证,如此article中所述,但我很难解决如何禁用提供的常规身份验证由grails 3 spring security plugin

以下是我目前的情况:用户A点击了我的网页。我想解析请求的标头并取出角色和用户名信息。如果用户名或角色为空,我会将用户重定向到某个网关。简单来说,我想通过调用插件提供的静态规则来仅使用spring security进行授权。即

grails.plugin.springsecurity.controllerAnnotations.staticRules = [
    [pattern: '/serviceb/**', access: "hasAnyRole('ROLE_COOL','ROLE_UNCOOL')"],
    [pattern: '/cools/**', access: ['ROLE_ADMINS']],
    [pattern: '/*', access: 'isAuthenticated()']
]

这就是我需要Spring安全性来执行任何登录功能的原因,因为first article状态,我们只能将其用于身份验证。

我尝试了什么:

首先,我删除了我的application.groovy文件中的所有与身份验证相关的调用(默认情况下在运行插件的快速入门时创建),即连接字符串,搜索过滤器,但静态规则< / p>

接下来,我尝试使用这两个帖子提供的解决方案:on stack和此on blog

我创建了一个Filter来扩展AbstractPreAuthenticatedProcessingFilter

package Cool.service.authentication
import org.springframework.security.web.authentication.preauth.AbstractPreAuthenticatedProcessingFilter
import javax.servlet.http.HttpServletRequest

class CGAuthenticationFilter extends AbstractPreAuthenticatedProcessingFilter {
    @Override
    protected Object getPreAuthenticatedPrincipal(HttpServletRequest request) { "username" }

    @Override
    protected Object getPreAuthenticatedCredentials(HttpServletRequest request) { "N/A" }
}

我的启动配置现在看起来像这样:

import grails.plugin.springsecurity.SecurityFilterPosition
import grails.plugin.springsecurity.SpringSecurityUtils

class BootStrap {

    def init = { servletContext ->
        SpringSecurityUtils.clientRegisterFilter('CGAuthenticationFilter', SecurityFilterPosition.PRE_AUTH_FILTER.order)
    }
}

我的Spring资源看起来像这样:

import Cool.service.authentication.CGAuthenticationFilter

beans = {
    myAuthenticationFilter(CGAuthenticationFilter) {
        authenticationManager = ref('authenticationManager')
        checkForPrincipalChanges = true
    }
}

最后,将这一行添加到我的spring.groovy spring security插件配置中:

grails.plugin.springsecurity.providerNames = ['preAuthenticatedAuthenticationProvider', 'anonymousAuthenticationProvider']

但是,我在尝试运行应用程序时遇到超级geneirc错误,其中服务器“失败”启动并且java返回非零值。这让我相信我走向了错误的方向,实施是完全错误的

1 个答案:

答案 0 :(得分:2)

要解决这个问题,我不得不更改几个文件。首先,我的Bootstrap文件现在包含以下init块:

SpringSecurityUtils.clientRegisterFilter('requestHeaderAuthenticationFilter', SecurityFilterPosition.PRE_AUTH_FILTER)

我的bean(resources.groovy)文件现在包含:

userDetailsService(grails.plugin.springsecurity.userdetails.GormUserDetailsService) {
    grailsApplication = ref('grailsApplication')
}

userDetailsByNameServiceWrapper(org.springframework.security.core.userdetails.UserDetailsByNameServiceWrapper) {
    userDetailsService = ref('userDetailsService')
}

preAuthenticatedAuthenticationProvider(org.springframework.security.web.authentication.preauth.PreAuthenticatedAuthenticationProvider) {
    preAuthenticatedUserDetailsService = userDetailsByNameServiceWrapper
}

requestHeaderAuthenticationFilter(Cool.service.authentication.GCHeaderAuthenticationFilter) {
    authenticationManager = ref('authenticationManager')
}

除此之外,配置的其余部分是正确的。