gpt4 book ai didi

Grails,Spring Security Rest Plugin,无法在空对象上调用方法 loadUserByToken()

转载 作者:行者123 更新时间:2023-12-02 15:19:58 26 4
gpt4 key购买 nike

我正在尝试在 grails 框架(2.5.0)中使用 Spring Security Plugin(2.0.0)和 Spring Authentication Rest Plugin(1.5.3)实现基于 token 的身份验证。我将 header 字段“x-auth-token”设置为 token 并发布到目标 Controller URL。但是,IDE(Intellij IDEA)弹出此错误消息

| Error 2016-07-12 15:58:27,864 [http-bio-8080-exec-10] ERROR [/hello_world].
[default] - Servlet.service() for servlet [default] in context with path [/hello_world] threw exception
Message: Cannot invoke method loadUserByToken() on null object
Line | Method
->> 55 | authenticate in grails.plugin.springsecurity.rest.RestAuthenticationProvider
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
| 75 | doFilter in grails.plugin.springsecurity.rest.RestTokenValidationFilter
| 53 | doFilter . . in grails.plugin.springsecurity.web.filter.GrailsAnonymousAuthenticationFilter
| 143 | doFilter in grails.plugin.springsecurity.rest.RestAuthenticationFilter
| 62 | doFilter . . in grails.plugin.springsecurity.web.authentication.logout.MutableLogoutFilter
| 80 | doFilter in grails.plugin.springsecurity.rest.RestLogoutFilter
| 59 | doFilter . . in grails.plugin.springsecurity.web.SecurityRequestHolderFilter
| 82 | doFilter in com.brandseye.cors.CorsFilter
| 1142 | runWorker . in java.util.concurrent.ThreadPoolExecutor
| 617 | run in java.util.concurrent.ThreadPoolExecutor$Worker
^ 745 | run . . . . in java.lang.Thread

我检查了这个 loadUserByToken() 方法,它是在 tokenStorageService 上调用的。我不知道为什么这个 tokenStorageService 是空对象。 Spring Security 和 Spring Security Plugin 配置如下:

配置文件
// Added by the Spring Security Core plugin:
grails.plugin.springsecurity.userLookup.userDomainClassName = 'hello_world.User'
grails.plugin.springsecurity.userLookup.authorityJoinClassName = 'hello_world.UserRole'
grails.plugin.springsecurity.authority.className = 'hello_world.Role'
grails.plugin.springsecurity.controllerAnnotations.staticRules = [
'/': ['permitAll'],
'/index': ['permitAll'],
'/index.gsp': ['permitAll'],
'/assets/**': ['permitAll'],
'/**/js/**': ['permitAll'],
'/**/css/**': ['permitAll'],
'/**/images/**': ['permitAll'],
'/**/favicon.ico': ['permitAll'],
'/api/login': ['permitAll']
]

grails {
plugin {
springsecurity {

filterChain.chainMap = [
'/api/guest/**': 'anonymousAuthenticationFilter,restTokenValidationFilter,restExceptionTranslationFilter,filterInvocationInterceptor',
'/api/**': 'JOINED_FILTERS,-exceptionTranslationFilter,-authenticationProcessingFilter,-securityContextPersistenceFilter,-rememberMeAuthenticationFilter', // Stateless chain
'/**': 'JOINED_FILTERS,-restTokenValidationFilter,-restExceptionTranslationFilter' // Traditional chain
]

providerNames = ['restAuthenticationProvider','daoAuthenticationProvider', 'rememberMeAuthenticationProvider']

auth.loginFormUrl = '/login/auth'

useSecurityEventListener = true

onAuthenticationSuccessEvent = { e, appCtx ->
// handle AuthenticationSuccessEvent

System.out.println("Authentication Succeeded");
}

onAuthenticationSwitchUserEvent = { e, appCtx ->
// handle AuthenticationSwitchUserEvent
}

onAuthorizationEvent = { e, appCtx ->
// handle AuthorizationEvent
}

onRestTokenCreationEvent = { e, appCtx ->

System.out.println("Token Created")
}

apf {
filterProcessesUrl = '/api/login'
allowSessionCreation = false
// usernamePropertyName = 'username'
// passwordPropertyName = 'password'
}

rest {

active = true

login {
active = true
endpointUrl = '/api/login'
failureStatusCode = 401
useJsonCredentials = true
usernamePropertyName = 'username'
passwordPropertyName = 'password'
}

token {

validation {
active = true
endpointUrl = '/api/validate'
headerName = 'x-auth-token'
useBearerToken = false
tokenPropertyName = 'access_token'
enableAnonymousAccess = true
}

generation {
active = true
useSecureRandom = true
useUUID = false
}

rendering {
usernamePropertyName = 'username'
authoritiesPropertyName = 'roles'
tokenPropertyName = 'token'
}

storage {
active = true
useGorm = true

gorm {
tokenDomainClassName = 'hello_world.AuthenticationToken'
tokenValuePropertyName = 'tokenValue'
usernamePropertyName = 'username'
}
}
}
}
}
}
}

资源.groovy
import grails.plugin.springsecurity.rest.RestAuthenticationProvider
beans = {
restAuthenticationProvider(RestAuthenticationProvider);
}

我检查了数据库, token 存储在 authentication_token 表中。我是 grails 的新手,一直在搜索几个小时,一点头绪都没有。谁能帮我?非常感激。

如果您还需要什么,请告诉我。

最佳答案

对于有同样问题的人,经过多次尝试,我终于想通了。看来我不应该在resources.groovy 中声明restAuthenticationProvider,也不应该在config.groovy 中将restAuthenticationProvider 添加到grails.plugin.springsecurity.providerNames。 spring-security-core 和 spring-security-rest 的完整配置如下:

配置.groovy

grails {
plugin {
springsecurity {

useSecurityEventListener = true

filterChain {
chainMap = [
'/api/**': 'JOINED_FILTERS,-exceptionTranslationFilter,-authenticationProcessingFilter,-securityContextPersistenceFilter,-rememberMeAuthenticationFilter', // Stateless chain
'/**': 'JOINED_FILTERS,-restTokenValidationFilter,-restExceptionTranslationFilter' // Traditional chain
]
} //filterChain

apf {
filterProcessesUrl = '/api/login'
} //apf

rest {

login {
active = true
useRequestParamsCredentials = false
useJsonCredentials = true
usernamePropertyName = 'j_username'
passwordPropertyName = 'j_password'
endpointUrl = '/api/login'
} //login

logout {

} //logout

token {

validation {
active = true
endpointUrl = '/api/validate'
useBearerToken = false
headername = 'X-Auth-Token'
} //validation

generation {
// active = true
// useSecureRandom = true;
// useUUID = false;
}

rendering {
usernamePropertyName = 'username'
authoritiesPropertyName = 'roles'
tokenPropertyName = 'token'
}

storage {
// useJWT = true;
} //storage
} //token
} //rest

cors.headers = ['Access-Control-Allow-Headers': 'Content-Type, Authorization, X-Auth-Token']
} //springsecurity
} //plugin
} //grails

您应该使用字段“j_username”和“j_password”以 json 格式发送用户名和密码,它将返回 json 格式的 token 。然后,在“X-Auth-Token” header 字段中将请求连同此 token 一起发送到您要查询的api。

初始化spring-security-core插件请咨询 http://grails-plugins.github.io/grails-spring-security-core/v2/guide/single.html#tutorials

我的完整代码可在 github 中找到: https://github.com/xixinhe/api_token_authentication

在运行我的代码之前,请安装 oracle mysql 5。

如果我写的任何东西违反了堆栈溢出规则,请告诉我,我会更改。

我不是以英语为母语的人,请原谅我蹩脚的英语。

谢谢,

关于Grails,Spring Security Rest Plugin,无法在空对象上调用方法 loadUserByToken(),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38321339/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com