我正在将 SpringSecurity 插件与应用程序集成。为此,我安装了插件并运行了 s2-quickstart 脚本,该脚本创建了三个域类:SecUser
、SecRole
和SecUserSecRole
以及登录/注销控制器。
由于我已经有一个现有的 User 域类并想保留它,所以我修改了 User 以扩展 SecUser 并从 User 中删除了用户名和密码的重叠字段。此外,我还添加tablePerHierarchy false
了 User 和 SecUser 映射部分。
在 BootStrap 中,我正在尝试创建一个管理员用户以在启动时存在。为此,我创建了一个新SecRole
对象 adminRole,其权限设置为 ROLE_ADMIN。然后,我创建一个新的 User 对象并通过以下方式检查它是否包含管理员角色
def springSecurityService
def init {
def adminUser = User.findByUsername('admin') ?: new User(
username:'admin',
password:'adminUser',
userType:'Admin',
enabled:true
).save(failOnError:true)
if (!adminUser.authorities.contains(adminRole))
SecUserSecRole.create adminUser, adminRole, true
}
我的问题是,无论 adminUser 是否被声明为 User 或 SecUser 实例,我都会不断收到瞬态实例异常。由于 userType 有一个空白约束:false,如果我在创建 User 实例时注释掉 userType 字段,我会得到一个异常,指出 null 不是 userType 的有效设置。当我包含它时,我得到了瞬态对象异常:对象引用了一个未保存的瞬态实例 - 在刷新之前保存瞬态实例: books4africa.SecUser,所以我知道我正在通过所有用户验证设置。
是什么导致在这种情况下无法保存有效的用户对象?
编辑
此问题的解决方案是删除现有的开发数据库文件并重新初始化应用程序。我的猜测是数据库和 Spring Security 与原始数据库之间存在某种冲突,因此使用新数据库重新启动应用程序解决了这个问题。
由于以下答案都没有解决确切的问题,因此在这种情况下我不会接受,但感谢您的帮助!