【问题标题】:Grails Spring Security 3 service springSecurityService is nullGrails Spring Security 3 服务 springSecurityService 为空
【发布时间】:2015-12-28 00:49:45
【问题描述】:

User中的springSecurityService服务始终为null

我似乎无法通过以下方式引用包本身

import grails.plugin.springsecurity.*;

虽然 spring 安全登录页面确实出现了,但 gradle 并没有抱怨缺少任何东西。

似乎没有发生 DI。

用户

package com.sciencecanvas.mykingdom


class User implements Serializable {

    private static final long serialVersionUID = 1

    transient springSecurityService

    String username
    String password
    boolean enabled = true
    boolean accountExpired
    boolean accountLocked
    boolean passwordExpired

    User(String username, String password) {
        //this()
        this.username = username
        this.password = password
    }

    @Override
    int hashCode() {
        username?.hashCode() ?: 0
    }

    @Override
    boolean equals(other) {
        is(other) || (other instanceof User && other.username == username)
    }

    @Override
    String toString() {
        username
    }

    Set<Role> getAuthorities() {
        UserRole.findAllByUser(this)*.role
    }

    def beforeInsert() {
        encodePassword()
    }

    def beforeUpdate() {
        if (isDirty('password')) {
            encodePassword()
        }
    }

    protected void encodePassword() {
        password = springSecurityService?.passwordEncoder ? springSecurityService.encodePassword(password) : password
    }

    static transients = ['springSecurityService']

    static constraints = {
        username blank: false, unique: true
        password blank: false
    }

    static mapping = {
        password column: '`password`'
    }
}

我的构建:

buildscript {
    ext {
        grailsVersion = project.grailsVersion
    }
    repositories {
        mavenLocal()
        maven { url "https://repo.grails.org/grails/core" }
    }
    dependencies {        
        classpath "org.grails:grails-gradle-plugin:$grailsVersion"
        classpath 'com.bertramlabs.plugins:asset-pipeline-gradle:2.5.0'
        classpath "org.grails.plugins:hibernate:4.3.10.5"
    }
}

plugins {
    id "io.spring.dependency-management" version "0.5.2.RELEASE"
    id 'com.jfrog.bintray' version '1.2'
}

version "0.1"
group "monopolyserver"

apply plugin: 'maven-publish'
apply plugin: "spring-boot"
apply plugin: "war"
apply plugin: "asset-pipeline"
apply plugin: 'eclipse'
apply plugin: 'idea'
apply plugin: "org.grails.grails-web"
apply plugin: "org.grails.grails-gsp"

ext {
    grailsVersion = project.grailsVersion
    gradleWrapperVersion = project.gradleWrapperVersion
}

assets {
    minifyJs = true
    minifyCss = true
}

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

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

dependencies {

    //custom plugins
    compile 'org.grails.plugins:spring-security-core:3.0.0.M1'

    compile "org.springframework.boot:spring-boot-starter-logging"
    compile "org.springframework.boot:spring-boot-starter-actuator"
    compile "org.springframework.boot:spring-boot-autoconfigure"
    compile "org.springframework.boot:spring-boot-starter-tomcat"
    compile 'mysql:mysql-connector-java:5.1.36'
    compile "org.grails:grails-dependencies"
    compile "org.grails:grails-web-boot"

    compile "org.grails.plugins:hibernate"
    compile "org.grails.plugins:cache"
    compile "org.hibernate:hibernate-ehcache"
    compile "org.grails.plugins:scaffolding"

    //compile ':spring-security-core:2.0-RC5'

    runtime "org.grails.plugins:asset-pipeline"

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

    // Note: It is recommended to update to a more robust driver (Chrome, Firefox etc.)
    testRuntime 'org.seleniumhq.selenium:selenium-htmlunit-driver:2.44.0'

    console "org.grails:grails-console"
}

task wrapper(type: Wrapper) {
    gradleVersion = gradleWrapperVersion
}

【问题讨论】:

标签: grails grails-plugin


【解决方案1】:

从 Grails 3.2.8 开始默认禁用 GORM 实体中的服务注入。因此,如果您希望服务 springSecurityService 被注入到先前的域类中,您需要打开自动装配。 grails-app/conf/application.yml 圣杯: 格姆: # 是否自动装配实体。 # 出于性能原因默认禁用。 自动接线:真

【讨论】:

【解决方案2】:

你可以试试 Holders.applicationContext.getBean('springSecurityService') 而不是注入它。

【讨论】:

  • 谢谢。我尝试了 transcient、autowired 和所有东西,但只有这个有效
【解决方案3】:

这是因为您在构造函数中注释掉了 this() - 那行代码调用了生成的执行 DI 的默认构造函数。这在文档的“新增功能”部分中进行了描述。要么删除构造函数并使用传统的地图构造函数,要么恢复那行代码。

【讨论】:

  • 这工作!虽然找不到与 this() 相关的文档。
  • 抱歉,在"domain classes" section - 请参阅以“实用”开头的注释
  • 链接坏了,能重新加载吗
猜你喜欢
  • 1970-01-01
  • 2023-03-24
  • 1970-01-01
  • 2019-02-25
  • 2016-08-20
  • 2013-10-18
  • 2015-04-10
  • 2016-05-05
  • 2015-10-19
相关资源
最近更新 更多