【问题标题】:How to extend Spring Security User Class in grails?如何在 grails 中扩展 Spring Security 用户类?
【发布时间】:2011-09-25 22:10:39
【问题描述】:

我在我的 grails 应用程序中使用 Spring Security 插件。我在自己生成的医师类中扩展了 Springs User 类。现在,当我运行应用程序时,我没有在数据库中获取医师表,而是用户类仅具有医师域中定义的所有属性。我需要为医师准备单独的表格。

当我尝试使用 User.findAll() 在 User 表中查找所有用户时,我的输出是,

[com.HospitalManagement.User:1,com.HospitalManagement.User:2,com.HospitalManagement.User:3,com.HospitalManagement.User:4,com.HospitalManagement.User:5,com.HospitalManagement.User: 6,com.HospitalManagement.User:7,com.HospitalManagement.User:8,com.HospitalManagement.User:9]

但我期待用户名和其他医师属性值。

可能是什么问题?

域类是:

package com.HospitalManagement

class Physician extends User{

    static constraints = {
    }

    String specilty;
    String MobileNo;
    String Physician_Address;
    String clinicals;


}

【问题讨论】:

  • 请显示您的域类代码。

标签: spring grails spring-security


【解决方案1】:

默认情况下,GORM 对具有继承性的域类使用逐层表模型。父类中的所有字段和每个子类中的所有字段都将存储在一个表中。

如果要关闭此功能,可以使用 tablePerHierarchy 映射参数。将此参数设置为false会将父类字段放在一个公共父表中,并将每个子类的字段放在自己的表中。这可能会使您的查询效率稍低,因为查询将具有连接,但如果继承树很小,则差异应该可以忽略不计。这是您的域类的样子:

package com.HospitalManagement

class Physician extends User {

    static constraints = {
    }

    String specilty;
    String MobileNo;
    String Physician_Address;
    String clinicals;


    static mapping = {
        tablePerHierarchy false
    }
}

有关更多信息,请参阅 grails 文档:

如果您希望每个子类都有自己的表,其中包含来自父类的所有字段和来自子类的所有字段,那么您可以将父类定义为“抽象”,这样可以防止 grails 为它。 Grails 应该只为具体领域类创建表,而不是抽象领域类。 [Source]

你的用户类看起来像这样:

abstract class User {
    String username
    String password
    //etc...
}

这将正确构建表,但我不确定它可能对 Spring Security 产生什么影响。如果您在将 User 类抽象后看到任何 Spring Security 错误,我会回退到禁用 table-per-hierarchy 并处理连接。

【讨论】:

  • 使用 tablePerHierarchy false 它会创建子类表,但其中没有基类字段列。
  • Quarfoth:使用 tablePerHierarchy false 它创建子类表,但其中没有基类字段列。
  • 对不起,我不认为我理解你的问题。我已经更新了我的答案,看看底部的位是否回答了你的问题。
【解决方案2】:

听起来您正在尝试显示对象的属性。也许您只想为您的 Physician 类覆盖 toString()

package com.HospitalManagement

    class Physician extends User{

        static constraints = {
        }

        String specilty;
        String MobileNo;
        String Physician_Address;
        String clinicals;

        String toString() {
            "specilty: $specilty, MobileNo: $MobileNo, Physician_Address: $Physician_Address, clinicals: $clinicals"
        }
    }

或类似的东西,取决于您希望输出的格式。

【讨论】:

    猜你喜欢
    • 2014-02-27
    • 2015-03-27
    • 1970-01-01
    • 2020-02-01
    • 2012-09-15
    • 2015-08-27
    • 2020-02-07
    • 2014-03-17
    • 2020-05-31
    相关资源
    最近更新 更多