Grails spring security rest inject tokenGenerator

Grails spring security rest inject tokenGenerator

我也有类似的要求 post 提到过。 :REST spring security - Manually authenticating a new user and getting access token

根据接受的答案,代码如下:

class RegisterController {

    def springSecurityService
    def tokenGenerator
    def tokenStorageService

    def register() {
         //do stuff
         springSecurityService.reauthenticate(username)
         String tokenValue = tokenGenerator.generateToken()
         tokenStorageService.storeToken(tokenValue, springSecurityService.principal)

         redirect url: "http://example.org/?access_token=${tokenValue}"
    } 
}

我试过了,但对我不起作用。似乎 TokenGenerator 实现 class 没有正确注入。我了解 grails-spring-security-rest TokenGenerator 中的默认实现将是 JWT,但想知道我应该在哪里注册或配置它。

好吧,如果你想使用 "tokenGenerator" 那么你需要在 "resources.groovy" 下注册它,如下所示

// creating the bean of token generator
tokenGenerator(SecureRandomTokenGenerator)

然后将其注入您的控制器或服务,如下所示

class RegisterController {

def springSecurityService
def tokenGenerator
def tokenStorageService

    def register() {
         //do stuff
         springSecurityService.reauthenticate(username)
         String tokenValue = tokenGenerator.generateToken()
         tokenStorageService.storeToken(tokenValue, springSecurityService.principal)

         redirect url: "http://example.org/?access_token=${tokenValue}"
    }
}

我遵循了相同的示例(稍作修改)并按预期工作。

我使用 "userDetailsService" 而不是 "springSecurityService.reauthenticate(username)"

来生成用户实例

所以我的函数如下所示。

/**
 * For generating the access token for the user
 *
 * @param userName : Holds the username of the user
 *
 * @return : access token
 */
String generateAccessToken(String userName){
    String tokenValue

    try{
        //load user details
        def userDetails = userDetailsService.loadUserByUsername(userName)

        //generate access token
        tokenValue = tokenGenerator.generateAccessToken(userDetails).accessToken

        //store access token
        tokenStorageService.storeToken(tokenValue, userDetails)
    } catch (Exception e){
       //Exception handling code
    }

    return tokenValue
}