sa-token/sa-token-doc/doc/more/common-questions.md
2021-08-01 05:39:31 +08:00

100 lines
5.4 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# 常见问题
本篇整理大家在群聊里经常提问的一些问题如有补充欢迎提交pr
---
### 加了注解进行鉴权认证,不生效?
注解鉴权功能默认关闭,两种方式任选其一进行打开:注册注解拦截器、集成`AOP模块`
如果已经打开仍然没有效果,加群说明一下复现步骤
### 整合Redis时除了引入pom依赖还需要做其它的吗
引入pom依赖后在框架层面你无须做其它事情但是你需要为项目指定一下`Redis`的连接信息,参考此文件:[application-dev](https://gitee.com/click33/sa-plus/blob/master/sp-server/src/main/resources/application-dev.yml)
### 登录方法需要我自己实现吗?
是的,不同于`shiro`等框架,`Sa-Token`不会在登录流程中强插一脚,开发者比对完用户的账号和密码之后,只需要调用`StpUtil.login(id)`通知一下框架即可
### 一个User对象存进Session后再取出来时报错无法从User类型转换成User类型
群员亲测,当你打开热部署模式后,先存进去的对象,再热刷新后再取出,会报错,关闭热刷新即可解决
### 框架抛出的权限不足异常,我想根据自定义提示信息,可以吗?
可以,在全局异常拦截器里捕获`NotPermissionException`,可以通过`getCode()`获取没有通过认证的权限码,可以据此自定义返回信息
### 我的项目权限模型不是RBAC模型很复杂可以集成吗
无论什么模型只要能把一个用户具有的所有权限塞到一个List里返回给框架就能集成
### SaRouter.match 有多个路径需要排除怎么办?
可以点进去源码看一下,`SaRouter.match`方法有多个重载,可以放一个集合, 例如:<br>
`SaRouter.match(Arrays.asList("/**"), Arrays.asList("/login", "/reg"), () -> StpUtil.checkLogin());`
### 为什么StpUtil.login() 不能直接写入一个User对象
`StpUtil.login()`只是为了给当前会话做个唯一标记,通常写入`UserId`即可如果要存储User对象可以使用`StpUtil.getSession()`获取Session对象进行存储
### 前后台分离模式下和普通模式有何不同?
主要是失去了`Cookie`无法自动化保存和提交`token秘钥`,可以参考章节:[前后台分离](/up/not-cookie)
### 前后台分离时前端提交的header参数是叫token还是satoken还是tokenName
默认是satoken如果想换一个名字更改一下配置文件的`tokenName`即可
### Springboot环境下采用自定义拦截器排除了某个路径仍然被拦截了
可能是404了SpringBoot环境下如果访问接口404后会被重定向到`/error`,然后被再次拦截,如果是其它原因,欢迎加群反馈
### 权限可以做成动态的吗?
权限本来就是动态的只有jwt那种模式才是非动态的
### 集成jwt后为什么在 getSession 时提示 jwt has not session ?
`jwt`的招牌便是无须借助服务端完成会话管理,如果集成`jwt`后再次使用`Session`功能,那将又回到了传统`Session`模式属于自断招牌此种技术组合没有任何意义因此jwt集成模式不提供`Session`功能,如果需要`Session`功能,就不要集成`jwt`
### 怎么关闭默认的Cookie模式呢
在配置文件将`isReadCookie`值配置为`false`
### 怎么关掉每次启动时的字符画打印?
在配置文件将`isPrint`值配置为`false`
### StpUtil.getSession()必须登录后才能调用吗?如果我想在用户未登录之前存储一些数据应该怎么办?
`StpUtil.getSession()`获取的是`User-Session`必须登录后才能使用如果需要在未登录状态下也使用Session功能请使用`Token-Session` <br>
步骤:先在配置文件里将`tokenSessionCheckLogin`配置为`false`,然后通过`StpUtil.getTokenSession()`获取Session
### 我只使用header来传输token还需要打开Cookie模式吗
不需要如果只使用header来传输token可以在配置文件关闭Cookie模式`isReadCookie=false`
### 我想让用户修改密码后立即掉线重新登录,应该怎么做?
框架内置 [强制指定账号下线] 的APi在执行修改密码逻辑之后调用此API即可: `StpUtil.logout()`
### 整合Redis时先选择了默认jdk序列化后又改成jackson序列化程序开始报错SerializationException
两者的序列化算法不一致导致的反序列化失败如果要更改序列化方式则需要先将Redis中历史数据清除再做更新
### 代码鉴权、注解鉴权、路由拦截鉴权,我该如何选择?
这个问题没有标准答案,这里只能给你提供一些建议,从鉴权粒度的角度来看:
1. 路由拦截鉴权:粒度最粗,只能粗略的拦截一个模块进行权限认证
2. 注解鉴权:粒度较细,可以详细到方法级,比较灵活
3. 代码鉴权粒度最细不光可以控制到方法级甚至可以if语句决定是否鉴权
So从鉴权粒度的角度来看需要针对一个模块鉴权的时候就用路由拦截鉴权需要控制到方法级的时候就用注解鉴权需要根据条件判断是否鉴权的时候就用代码鉴权
### 还是有不明白到的地方?
请在`gitee` 、 `github` 提交 `issues`或者加入qq群交流群链接在[首页](README?id=交流群)
### 我能为这个框架贡献代码吗?
**可以**如果有好的想法请直接提交pr步骤