【问题标题】:spring security problem using grails使用grails的春季安全问题
【发布时间】:2023-03-06 02:46:01
【问题描述】:

我是 grails 和 spring 安全插件核心的新手,但我面临一个问题

错误 GrailsExceptionResolver - 具有相同标识符值的不同对象已与会话关联:[nayax.SecUserSecRole#nayax.SecUserSecRole : null]

我的代码是:

NayaxUser populateDataFromJson(def user) {
    //todo: HANDLE CASES OF CREATING ROLES FOR USER AND REAUTHENTICATE THEM
    println "#### In FUNCTION ####"
    Facebook existingProfile = Facebook.findByFid(user.id)
    if (existingProfile) {
        println "### User already present in the database ####"
        existingProfile.setUser(existingProfile.user)

        //todo: CREATE ROLE AND REAUTHENTICATE USER
        SecRole secRole1 = SecRole.findByAuthority(SecRoleConstants.ROLE_USER)
        SecUserSecRole.create(existingProfile.user, secRole1)

        //todo: REAUTHENTICATE USER
        springSecurityService.reauthenticate(existingProfile.user.username)

        existingProfile.user.merge()
        return existingProfile.user
    }
    else {
        Facebook facebookObj = new Facebook(fid: user.id, lastLogin: new Date(), creationDate: new Date()).save(flush: true)
        NayaxUser nayaxUser = new NayaxUser(facebookUrl: user.link, fullName: user.name, facebook: facebookObj, username: user.email, password: springSecurityService.encodePassword("pleaseChangeMe"), enabled: true)
        if (nayaxUser.save(flush: true)) {
            println "### WORK DONE , saved user and save the user in session ###"
            facebookObj.setUser(nayaxUser)

            //todo: CREATE ROLE AND REAUTHENTICATE USER
            SecRole secRole = SecRole.findByAuthority(SecRoleConstants.ROLE_USER)
            SecUserSecRole.create(nayaxUser, secRole)

            //todo: REAUTHENTICATE USER
            springSecurityService.reauthenticate(nayaxUser.username)

            nayaxUser.merge()
            return nayaxUser
        }
        else {
            println "### ERROR IN VALIDATING DATA So NOT SETTING THE USER IN SESSION ####"
            nayaxUser.errors.allErrors.each { error ->
                println("### ERROR IS ${error} ####")
            }
            return nayaxUser
        }
    }
}

实际上,当我从 facebook 按钮登录,然后从我的实现中注销,然后再次快速重新登录时,会出现异常,但在注销后我刷新页面几次,问题就消失了。我认为我的 facebook 注销实现有问题,或者代码中有什么东西???

欢迎任何建议..

【问题讨论】:

    标签: facebook grails login grails-plugin


    【解决方案1】:

    在调用注销控制器清除会话等之前尝试使用 facebook javascript api 注销,例如:

    if facebook user exists
      logout facebook user with fb js api
      js redirect to logout controller  
    else
      redirect user to logout controller
    

    这个逻辑应该应用在你的应用程序的前端,假设如果没有 facebook 用户,用户将被直接重定向到注销控制器。

    我在使用来自 fb 应用程序的 java 和 php api 退出 facebook 时遇到问题,但通过这种方式我克服了这些问题。

    【讨论】:

      猜你喜欢
      • 2018-09-11
      • 2020-09-27
      • 1970-01-01
      • 1970-01-01
      • 2020-09-25
      • 2015-11-09
      • 1970-01-01
      • 2017-10-01
      • 2013-12-22
      相关资源
      最近更新 更多