0

我正在开发一个 Grails 3.2.2 插件,我试图在其中覆盖来自 spring-security-ui 的RegisterController以及register.gsp。我使用了 s2ui-override 命令,它为我创建了所需的控制器,目前我只添加了一个 println 来查看它的工作原理,但它似乎仍在使用原来的控制器。到目前为止,我有:

注册控制器

import org.springframework.security.core.userdetails.UserDetailsService
import org.springframework.security.core.userdetails.UserDetails
import grails.plugin.springsecurity.ui.RegisterCommand

class RegisterController extends grails.plugin.springsecurity.ui.RegisterController {

static defaultAction = 'register'

UserDetailsService userDetailsService

@Override
def register(RegisterCommand registerCommand) {
    println "IN MY CONTROLLER!!"
    def registerReturn = super.register(registerCommand)
    if (registerReturn?.emailSent) {
        UserDetails createdUser = userDetailsService.loadUserByUsername(registerCommand.username)

        println "New user ${createdUser}"
    }
    registerReturn
}

def otherAction() {
    println "IN MY CONTROLLER!!"
    println "userDetailsService = ${userDetailsService}"
    "Hellloooo"
}

}

register.gsp和原来一样,只是增加了

<p style="color:red;"> HELLLOOOOOOO </p>

紧跟在body标签之后

网址映射

class UrlMappings {

static mappings = {
    "/$controller/$action?/$id?(.$format)?"{
        constraints {
            // apply constraints here
        }
    }

    "/"(view:"/index")
    "500"(view:'/error')
    "404"(view:'/notFound')
 }
}

运行应用程序时的结果: 我可以在顶部看到示例红色文本,但在控制台中看不到输出,尽管在运行应用程序时收到警告。转到“注册”URL 时的控制台输出:

 Running application...
 WARNING: The [register] action accepts a parameter of type [grails.plugin.springsecurity.ui.RegisterCommand] which does not implement grails.validation.Validateable.  Data binding will still be applied to this command object but the instance will not be validateable.

   @Override
   ^

 Configuring Spring Security Core ...
 ... finished configuring Spring Security Core


 Configuring Spring Security UI ...
 ... finished configuring Spring Security UI


Configuring Spring Security REST 2.0.0.M2...
 ... finished configuring Spring Security REST

Grails application running at http://localhost:8060 in environment: development

虽然当我去“注册/其他行动”时,我得到:

IN MY CONTROLLER
userDetailsService = grails.plugin.springsecurity.userdetails.GormUserDetailsService@10ed50b0

有趣的是,如果我在本地发布插件(我的 .m2 目录)并将其导入应用程序,我会在控制台中获取我的 printlns,我的 gsp 现在没有被使用(我看不到我的红色 Hello 文本)。控制台输出:

IN MY CONTROLLER!!
// unimportant mailing error
New user grails.plugin.springsecurity.userdetails.GrailsUser@364492: Username: test; Password: [PROTECTED]; Enabled: true; AccountNonExpired: true; credentialsNonExpired: true; AccountNonLocked: false; Granted Authorities: ROLE_NO_ROLES

任何人都可以帮助我在哪里出错?我很乐意提供任何其他可能有帮助的资源。

4

1 回答 1

0

所以我有一个修复(也许是一种解决方法):

注册控制器

class RegisterController extends grails.plugin.springsecurity.ui.RegisterController {

static namespace = 'my-great-plugin'

UserDetailsService userDetailsService

@Override
def register(RegisterCommand registerCommand) {
    println "IN MY CONTROLLER!!"
    def registerReturn = super.register(registerCommand)
    println "Got return from super call ${registerReturn}"
    if (registerReturn?.emailSent) {
        UserDetails createdUser = userDetailsService.loadUserByUsername(registerCommand.username)
        println "New user ${createdUser}"
    }
    registerReturn
}

def otherAction() {
    println "IN MY CONTROLLER"
    println "userDetailsService = ${userDetailsService}"
    "Hellloooo"
}

MyPluginUrlMappings.groovy

static mappings = {
    "/register/$action?/$id?(.$format)?" { 
        controller = 'register' 
        namespace = 'my-great-plugin' 
    }
}

MyPluginGrailsPlugn.groovy

 def loadAfter = ['springSecurityCore', 'springSecurityUi', 'springSecurityRest']

它现在有效!

我仍然愿意接受有关如何更好地处理这个问题的建议

于 2017-01-26T00:54:22.753 回答