我有类似的要求,就像这篇文章提到的那样。 :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实现类没有正确注入。我理解grails-spring-security-rest TokenGenerator中的默认实现将是JWT,但我想知道应该在哪里注册或配置它。
答案 0 :(得分:1)
如果您想使用"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
}