我的 Grails 3.3.8 应用程序中 SpringSecurityService 中的 MissingPropertyException

Posted

技术标签:

【中文标题】我的 Grails 3.3.8 应用程序中 SpringSecurityService 中的 MissingPropertyException【英文标题】:MissingPropertyException in SpringSecurityService in my Grails 3.3.8 application 【发布时间】:2019-02-15 06:51:15 【问题描述】:

使用 grails spring 安全插件 (3.2.3) 我有一个应用程序,其中包含使用本指南创建的标准域类:

https://grails-plugins.github.io/grails-spring-security-core/3.2.x/index.html#tutorials

教程中指定了以下类:

Role.groovy、UserRole.groovy 和 User.groovy。

User.groovy 还添加了以下代码:

static belongsTo = [store: Store]

我还添加了两个额外的域类:

Store.groovy:

package com.mycompany.myapp

class Store 

    String name

    static constraints = 
    

BookShop.groovy:

package com.mycompany.myapp

class BookShop extends Store 

    Boolean isOpen

    static constraints = 
    

我在 Bootstrap.groovy 中创建了一个用户:

def init = 

    def adminRole = new Role(authority: 'ROLE_ADMIN').save()

    def testBookShop = new BookShop(name: "BookShop", isOpen: true).save()

    def testUser = new User(username: 'me', password: 'password', store: testBookShop).save()

    UserRole.create testUser, adminRole

    UserRole.withSession 
        it.flush()
        it.clear()
    

    assert User.count() == 1
    assert Role.count() == 1
    assert UserRole.count() == 1

我将 spring 安全服务注入 SecureController.groovy 并尝试呈现以下内容:

package com.mycompany.myapp

import grails.plugin.springsecurity.annotation.Secured

class SecureController 

    def springSecurityService

    @Secured('ROLE_ADMIN')
    def index() 
        def currentUser = springSecurityService.currentUser
        render 'Store: ' + currentUser.store.name + ' is open = ' + currentUser.store.isOpen
    

我收到以下错误:

2018-09-10 20:34:26.068 ERROR --- [nio-8080-exec-2] 
o.g.web.errors.GrailsExceptionResolver   : MissingPropertyException 
occurred when processing request: [GET] /secure/index
No such property: isOpen for class: com.mycompany.myapp.BookShop

如果我专门打开商店的包装,我可以让它工作:

render 'Store: ' + currentUser.store.name + ' is open = ' +
            GrailsHibernateUtil.unwrapIfProxy(currentUser.store).isOpen

只是想知道是否有更好的解决方案来解决这个问题,我正在将一个大型应用程序从 grails 2.5.5 更新到 3.3.8,这在 2.5.5 中有效,我需要更改很多代码使用上面的方法,希望能快速解决,谢谢。

【问题讨论】:

您好,我看不到您问题的原因,我只是重新创建了您在问题中描述的场景,grails 版本,相同的 spring 安全插件版本。如果看起来不错,请查看此存储库github.com/ilmoralito/springsecurityserviceexample,我按照您的示例进行操作并验证没有问题。也许你通过了一些微妙的被忽视的东西。问候 您好 user615274,您已经解决了我的问题,问题似乎与我使用的 GORM 版本有关,如果您在 github 项目中将其更改为以下内容,您应该能够重新创建:gormVersion =6.1.9.RELEASE 当我将其更改为 6.1.10.RELEASE 时,问题似乎消失了,谢谢。 好消息,我很高兴它现在可以工作了 【参考方案1】:

修复似乎是将 GORM 从 6.1.9.RELEASE 升级到 6.1.10.RELEASE。在升级说明中没有看到任何内容表明这是一个已知错误,因此无法评论 GORM 中的确切问题。

编辑: 此处记录的问题 - https://github.com/grails/grails-data-mapping/issues/1072

【讨论】:

以上是关于我的 Grails 3.3.8 应用程序中 SpringSecurityService 中的 MissingPropertyException的主要内容,如果未能解决你的问题,请参考以下文章

运行 Grails 3.3.8 应用程序启动失败时出错

如何在 grails 3.3.8 中模拟被测控制器的方法

如何在 Grails 上开发新的资源包?

Grails:Spring Security 插件对于简单的安全性来说是不是过于强大

在 Grails 3.0 中配置 Spring Boot Security 以使用 BCrypt 密码编码

为啥 Netbeans 无法识别我的 Grails 应用程序中的 Maven 依赖项导入?