在 Grails Spring 安全核心插件中配置了两次 Spring 安全核心框架

Posted

技术标签:

【中文标题】在 Grails Spring 安全核心插件中配置了两次 Spring 安全核心框架【英文标题】:Spring security core framework getting configured twice in Grails Spring security core plugin 【发布时间】:2016-06-12 23:34:39 【问题描述】:

我正在使用 Grails spring security core 插件版本 3.0.3。

配置spring security核心框架时的调试语句打印两次,过滤器链也初始化两次

WARN grails.plugin.springsecurity.SpringSecurityCoreGrailsPlugin -
Configuring Spring Security Core ...

Configuring Spring Security Core ...
WARN grails.plugin.springsecurity.SpringSecurityCoreGrailsPlugin - ... finished
configuring Spring Security Core

... finished configuring Spring Security Core

构建 gradle 文件

buildscript 
    ext 
        grailsVersion = project.grailsVersion
    
    repositories 
        mavenLocal()
        maven  url "https://repo.grails.org/grails/core" 
    
    dependencies 
        classpath "org.grails:grails-gradle-plugin:$grailsVersion"
        classpath "org.grails.plugins:hibernate:4.3.10.5"
    


plugins 
    id "io.spring.dependency-management" version "0.5.2.RELEASE"


version "0.1"
group "restservicesapp"

apply plugin: "spring-boot"
apply plugin: "war"
apply plugin: 'eclipse'
apply plugin: 'idea'
apply plugin: "org.grails.grails-web"

ext 
    grailsVersion = project.grailsVersion
    gradleWrapperVersion = project.gradleWrapperVersion


repositories 
    mavenLocal()
    maven  url "https://repo.grails.org/grails/core" 


dependencyManagement 
    imports 
        mavenBom "org.grails:grails-bom:$grailsVersion"
    
    applyMavenExclusions false


dependencies 
    compile "org.springframework.boot:spring-boot-starter-logging"
    compile "org.springframework.boot:spring-boot-starter-actuator"
    compile "org.springframework.boot:spring-boot-autoconfigure"
    provided "org.springframework.boot:spring-boot-starter-tomcat"
    compile "org.grails.plugins:hibernate"
    compile "org.grails.plugins:cache"
    compile "org.hibernate:hibernate-ehcache"

    runtime "mysql:mysql-connector-java:5.1.38"
    compile 'org.grails.plugins:spring-security-core:3.0.3'
    compile ('org.grails.plugins:spring-security-rest-gorm:2.0.0.M2') 
        exclude group: 'org.grails.plugins', module: 'spring-security-core'
    


    testCompile "org.grails:grails-plugin-testing"
    testCompile "org.grails.plugins:geb"

    //console "org.grails:grails-console"


task wrapper(type: Wrapper) 
    gradleVersion = gradleWrapperVersion

【问题讨论】:

1) 在 build.gradle 中删除 Spring Security Core 2) grails clean 3) grails run-app 你还看到 spring security 启动了吗? 我的构建 gradle 文件中只定义了 grails spring 安全核心和其余插件。在启动 grails 应用程序期间我没有收到任何错误,并且 spring 安全工作正常。我想知道为什么调试语句会打印两次。 【参考方案1】:

我相信 Spring Security 没有被配置两次。一行输出来自日志记录,另一行是 println。 下面是来自grails.plugin.springsecurity.SpringSecurityCoreGrailsPlugin的一些代码:

    Closure doWithSpring()  ->
    ReflectionUtils.application = SpringSecurityUtils.application = grailsApplication

    SpringSecurityUtils.resetSecurityConfig()
    def conf = SpringSecurityUtils.securityConfig
    boolean printStatusMessages = (conf.printStatusMessages instanceof Boolean) ? conf.printStatusMessages : true
    if (!conf || !conf.active) 
        if (printStatusMessages) 
            String message = '\n\nSpring Security is disabled, not loading\n\n'
            log.warn message
            println message
        
        return
    

    log.trace 'doWithSpring'

    if (printStatusMessages) 
        String message = '\nConfiguring Spring Security Core ...'
        log.warn message
        println message
    

【讨论】:

【参考方案2】:

你的 build.gradle 中有 org.grails.plugins:cxf 吗?可能正在创建两个上下文。一个用于您的主应用程序,另一个用于您的/services/*。将 cfx 依赖项移动到 spring security 插件上方的 gradle 文件中,然后您应该会看到 spring security 只配置了一次。我已经为此苦苦挣扎了两个多星期。但这为我解决了这个问题。对我来说,这实际上是一个问题,因为第二次配置弹簧安全性有时会给我的 NPE。 See this question 仅来自我自己。

更新

我的上述评估被证明是错误的。真正的解决方案是,将以下 sn-p 添加到您的 build.gradle configurations.runtime exclude module: "cxf"

【讨论】:

以上是关于在 Grails Spring 安全核心插件中配置了两次 Spring 安全核心框架的主要内容,如果未能解决你的问题,请参考以下文章

Groovy:使用 Grails 和 Spring 安全核心插件时出现意外令牌

带有 grails 的 Spring Security 核心插件

Grails - SSL 和 Spring 安全核心

Grails Spring 安全插件 AJAX 身份验证

插件安装后 Grails Apache 中断?

Grails 3 Spring 安全插件