Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

StpLogicJwtForMixin下调用StpUtil.login,出现this api is disabled异常? #361

Closed
ddxl123 opened this issue Jan 1, 2023 · 11 comments

Comments

@ddxl123
Copy link

ddxl123 commented Jan 1, 2023

使用版本:

implementation("cn.dev33:sa-token-spring-boot-starter:1.33.0")
implementation("cn.dev33:sa-token-jwt:1.33.0")
implementation("cn.dev33:sa-token-dao-redis:1.33.0")

涉及的功能模块:

sa-token 
jwt 
redis 
StpLogicJwtForMixin
StpUtil.login(user_id)

测试步骤:

使用 StpLogicJwtForStateless 正常,一切换成 StpLogicJwtForMixin 就出现一下异常:

cn.dev33.satoken.exception.ApiDisabledException: this api is disabled
	at cn.dev33.satoken.jwt.StpLogicJwtForMixin.replaced(StpLogicJwtForMixin.java:149) ~[sa-token-jwt-1.33.0.jar:na]
	at cn.dev33.satoken.stp.StpLogic.distUsableToken(StpLogic.java:403) ~[sa-token-core-1.33.0.jar:na]
	at cn.dev33.satoken.stp.StpLogic.createLoginSession(StpLogic.java:362) ~[sa-token-core-1.33.0.jar:na]
	at cn.dev33.satoken.stp.StpLogic.login(StpLogic.java:331) ~[sa-token-core-1.33.0.jar:na]
	at cn.dev33.satoken.stp.StpLogic.login(StpLogic.java:293) ~[sa-token-core-1.33.0.jar:na]
	at cn.dev33.satoken.stp.StpUtil.login(StpUtil.java:135) ~[sa-token-core-1.33.0.jar:na]
	at com.example.demo.controller.controller.RegisterAndLoginController.sendOrVerify(RegisterAndLoginController.kt:64) ~[main/:na]
	at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method) ~[na:na]
	at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:77) ~[na:na]
	at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) ~[na:na]
	at java.base/java.lang.reflect.Method.invoke(Method.java:568) ~[na:na]
	at org.springframework.web.method.support.InvocableHandlerMethod.doInvoke(InvocableHandlerMethod.java:205) ~[spring-web-5.3.23.jar:5.3.23]
	at org.springframework.web.method.support.InvocableHandlerMethod.invokeForRequest(InvocableHandlerMethod.java:150) ~[spring-web-5.3.23.jar:5.3.23]
	at org.springframework.web.servlet.mvc.method.annotation.ServletInvocableHandlerMethod.invokeAndHandle(ServletInvocableHandlerMethod.java:117) ~[spring-webmvc-5.3.23.jar:5.3.23]
	at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.invokeHandlerMethod(RequestMappingHandlerAdapter.java:895) ~[spring-webmvc-5.3.23.jar:5.3.23]
	at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.handleInternal(RequestMappingHandlerAdapter.java:808) ~[spring-webmvc-5.3.23.jar:5.3.23]
	at org.springframework.web.servlet.mvc.method.AbstractHandlerMethodAdapter.handle(AbstractHandlerMethodAdapter.java:87) ~[spring-webmvc-5.3.23.jar:5.3.23]
	at org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:1071) ~[spring-webmvc-5.3.23.jar:5.3.23]
	at org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:964) ~[spring-webmvc-5.3.23.jar:5.3.23]
	at org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:1006) ~[spring-webmvc-5.3.23.jar:5.3.23]
	at org.springframework.web.servlet.FrameworkServlet.doPost(FrameworkServlet.java:909) ~[spring-webmvc-5.3.23.jar:5.3.23]
	at javax.servlet.http.HttpServlet.service(HttpServlet.java:696) ~[tomcat-embed-core-9.0.68.jar:4.0.FR]
	at org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:883) ~[spring-webmvc-5.3.23.jar:5.3.23]
	at javax.servlet.http.HttpServlet.service(HttpServlet.java:779) ~[tomcat-embed-core-9.0.68.jar:4.0.FR]
	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:227) ~[tomcat-embed-core-9.0.68.jar:9.0.68]
	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:162) ~[tomcat-embed-core-9.0.68.jar:9.0.68]
	at org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:53) ~[tomcat-embed-websocket-9.0.68.jar:9.0.68]
	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:189) ~[tomcat-embed-core-9.0.68.jar:9.0.68]
	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:162) ~[tomcat-embed-core-9.0.68.jar:9.0.68]
	at org.springframework.web.filter.RequestContextFilter.doFilterInternal(RequestContextFilter.java:100) ~[spring-web-5.3.23.jar:5.3.23]
	at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:117) ~[spring-web-5.3.23.jar:5.3.23]
	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:189) ~[tomcat-embed-core-9.0.68.jar:9.0.68]
	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:162) ~[tomcat-embed-core-9.0.68.jar:9.0.68]
	at org.springframework.web.filter.FormContentFilter.doFilterInternal(FormContentFilter.java:93) ~[spring-web-5.3.23.jar:5.3.23]
	at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:117) ~[spring-web-5.3.23.jar:5.3.23]
	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:189) ~[tomcat-embed-core-9.0.68.jar:9.0.68]
	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:162) ~[tomcat-embed-core-9.0.68.jar:9.0.68]
	at org.springframework.web.filter.CharacterEncodingFilter.doFilterInternal(CharacterEncodingFilter.java:201) ~[spring-web-5.3.23.jar:5.3.23]
	at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:117) ~[spring-web-5.3.23.jar:5.3.23]
	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:189) ~[tomcat-embed-core-9.0.68.jar:9.0.68]
	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:162) ~[tomcat-embed-core-9.0.68.jar:9.0.68]
	at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:197) ~[tomcat-embed-core-9.0.68.jar:9.0.68]
	at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:97) ~[tomcat-embed-core-9.0.68.jar:9.0.68]
	at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:541) ~[tomcat-embed-core-9.0.68.jar:9.0.68]
	at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:135) ~[tomcat-embed-core-9.0.68.jar:9.0.68]
	at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:92) ~[tomcat-embed-core-9.0.68.jar:9.0.68]
	at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:78) ~[tomcat-embed-core-9.0.68.jar:9.0.68]
	at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:360) ~[tomcat-embed-core-9.0.68.jar:9.0.68]
	at org.apache.coyote.http11.Http11Processor.service(Http11Processor.java:399) ~[tomcat-embed-core-9.0.68.jar:9.0.68]
	at org.apache.coyote.AbstractProcessorLight.process(AbstractProcessorLight.java:65) ~[tomcat-embed-core-9.0.68.jar:9.0.68]
	at org.apache.coyote.AbstractProtocol$ConnectionHandler.process(AbstractProtocol.java:893) ~[tomcat-embed-core-9.0.68.jar:9.0.68]
	at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1789) ~[tomcat-embed-core-9.0.68.jar:9.0.68]
	at org.apache.tomcat.util.net.SocketProcessorBase.run(SocketProcessorBase.java:49) ~[tomcat-embed-core-9.0.68.jar:9.0.68]
	at org.apache.tomcat.util.threads.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1191) ~[tomcat-embed-core-9.0.68.jar:9.0.68]
	at org.apache.tomcat.util.threads.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:659) ~[tomcat-embed-core-9.0.68.jar:9.0.68]
	at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61) ~[tomcat-embed-core-9.0.68.jar:9.0.68]
	at java.base/java.lang.Thread.run(Thread.java:833) ~[na:na]

文档里说

[调用 StpUtil.getExtra("name") 报错:this api is disabled。](https://sa-token.cc/doc.html#/more/common-questions?id=q%ef%bc%9a%e8%b0%83%e7%94%a8-stputilgetextraquotnamequot-%e6%8a%a5%e9%94%99%ef%bc%9athis-api-is-disabled%e3%80%82)

但是我只调用了StpUtil.login这一个函数。

上面抛出的异常中,
调用StpUtil.login时,内部必然会调用replaced,但是StpLogicJwtForMixinreplaced函数被标记为禁用的throw new ApiDisabledException();

这是哪里出问题了?

@click33
Copy link
Collaborator

click33 commented Jan 1, 2023

yml配置贴一下

@ddxl123
Copy link
Author

ddxl123 commented Jan 1, 2023

yml配置贴一下

  redis:
    host: 127.0.0.1
    port: 6379
    # Redis数据库索引(默认为0)
    database: 0
    # 读取超时时间
    timeout: 30s
    # 连接超时时间
    connect-timeout: 30s
sa-token:
  # token名称 (同时也是cookie名称),会自动从请求头根据 token-name key,获取 value
  token-name: token
  # token value 的前缀
  token-prefix: Bearer
  # token有效期,单位s 默认30天, -1代表永不过期
  timeout: -1
  # token临时有效期 (指定时间内无操作就视为token过期) 单位: 秒
  activity-timeout: -1
  # 是否允许同一账号并发登录 (为true时允许一起登录, 为false时新登录挤掉旧登录)
  is-concurrent: false
  # 在多人登录同一账号时,是否共用一个token (为true时所有登录共用一个token, 为false时每次登录新建一个token)
  is-share: false
  # token风格
  token-style: uuid
  # 是否输出操作日志
  is-log: true
  # jwt 密钥
  jwt-secret-key: longjwtsecretkey1111

@click33
Copy link
Collaborator

click33 commented Jan 1, 2023

is-concurrent 和 is-share 都改成 true

@click33
Copy link
Collaborator

click33 commented Jan 1, 2023

image

@ddxl123
Copy link
Author

ddxl123 commented Jan 1, 2023

@click33

意思是混入模式必然得支持 [并发登录] 和 [共用一个token] 吗?

@click33
Copy link
Collaborator

click33 commented Jan 1, 2023


你配置时得避开触发顶人下线功能

@ddxl123
Copy link
Author

ddxl123 commented Jan 1, 2023

对 你配置时得避开触发顶人下线功能

好的,明白了,谢谢!

@ddxl123 ddxl123 closed this as completed Jan 1, 2023
@ddxl123
Copy link
Author

ddxl123 commented Jan 1, 2023

@click33

        StpUtil.checkLogin()
        StpUtil.logout()
        StpUtil.checkLogin()

为什么logout注销了,还是检测到已登录?
而且redis的token并没有被清除。

StpLogicJwtForMixin中,logout()没有被标记 [禁用],但是 logout(Object loginId, String device) 却被标记为 [禁用],
logout() 中注释有一行 // ...,这就令人好奇了,其他地方都没有这样子的注释,就这个函数带有这个注释,不知道是我使用问题,还是 logout() 没有完善问题...

StpLogicJwtForMixin 源码

	/**
	 * 会话注销 
	 */
	@Override
	public void logout() {
		// ... 

 		// 从当前 [storage存储器] 里删除 
 		SaHolder.getStorage().delete(splicingKeyJustCreatedSave());
 		
 		// 如果打开了Cookie模式,则把cookie清除掉 
 		if(getConfig().getIsReadCookie()){
 			SaHolder.getResponse().deleteCookie(getTokenName());
		}
	}

而且,手动把redis的token删除,StpUtil.checkLogin() 仍然不会抛出未登录异常.

@ddxl123 ddxl123 reopened this Jan 1, 2023
@ddxl123
Copy link
Author

ddxl123 commented Jan 2, 2023

@click33

@ddxl123
Copy link
Author

ddxl123 commented Jan 2, 2023

@click33
这有两个相似问题,但是没有结果:#277 #188

@ddxl123
Copy link
Author

ddxl123 commented Jan 2, 2023

这个问题关闭,我新开了个issue
#362

@ddxl123 ddxl123 closed this as completed Jan 2, 2023
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

2 participants