一.权限登录模块包括几个基本子模块:
1.登录。
实现方式大致为:先检验用户名密码是否正确,如正确则在缓存中存入用户信息(一般必须要有用户标识和访问token,或再加一些附加信息如用户的角色权限),再返回访问token给客户端。
2.过滤器,主要通过客户端访问时带的token检验是否有访问url权限。
实现方式大致为:通过客户端访问的url匹配资源类型。一些资源可直接放行,一些资源需要校验登录,一些资源需要校验角色权限。
3.获取角色权限的方式。
因为取权限角色的方式不同,一般权限框架会提供一层抽象(接口),需要开发者实现。取角色权限未必需要在过滤器中调用,可以在任何需要的时候调用。
根据缓存方式不同可以做一层抽象(接口)。
Sa-Token框架的核心类是cn.dev33.satoken.stp.StpLogic,该类实现了大部分简单逻辑操做功能。
二.登录。
1.Sa-token默认登录操作cn.dev33.satoken.stp.StpLogic#login(Object, SaLoginModel),第一个参数为自定义用户的凭证
cn.dev33.satoken.stp.StpLogic#login==>cn.dev33.satoken.stp.StpLogic#createLoginSession
/**
* 创建指定账号id的登录会话
* @param id 登录id,建议的类型:(long | int | String)
* @param loginModel 此次登录的参数Model
* @return 返回会话令牌
*/
public String createLoginSession(Object id, SaLoginModel loginModel) {
// ------ 前置检查
SaTokenException.throwByNull(id, "账号id不能为空");
// ------ 1、初始化 loginModel
SaTokenConfig config = getConfig();
loginModel.build(config);
// ------ 2、分配一个可用的 Token
String tokenValue = distUsableToken(id, loginModel);
// ------ 3. 获取 User-Session , 续期
SaSession session = getSessionByLoginId(id, true);
session.updateMinTimeout(loginModel.getTimeout());
// 在 User-Session 上记录token签名
session.addTokenSign(tokenValue, loginModel.getDeviceOrDefault());
// ------ 4. 持久化其它数据
// token -> id 映射关系
saveTokenToIdMapping(tokenValue, id, loginModel.getTimeout());
// 写入 [token-last-activity]
setLastActivityToNow(tokenValue);
// $$ 发布事件:账号xxx 登录成功
SaTokenEventCenter.doLogin(loginType, id, tokenValue, loginModel);
// 检查此账号会话数量是否超出最大值
if(config.getMaxLoginCount() != -1) {
logoutByMaxLoginCount(id, session, null, config.getMaxLoginCount());
}
// 返回Token
return tokenValue;
}
上面第2步生成token后,第3步底层在缓存中添加token和session对象的映射。

上面第4步底层又存入了token和用户凭证的映射关系

第三方框架snowy在登录时又在缓存中存了用户权限角色基本信息,方便单点登录时取权限角色信息(存在下面session的dataMap中)

文章详细介绍了Sa-Token框架在权限登录模块中的实现,包括登录、过滤器配置以及权限获取的流程。登录过程涉及用户凭证校验、token生成和存储。过滤器通过客户端token验证访问权限,同时配置了注解拦截器以支持权限注解。权限获取则从缓存中直接读取。整个框架提供了灵活的角色和权限管理机制。
1万+

被折叠的 条评论
为什么被折叠?



