目录
概念
前置知识回顾
拿到UserInfo 用于自定义权限和角色的获取逻辑
最后进行要进行 satoken 过滤器全局配置
概念
做权限认证的时候 我们首先要明确两点
我们必要的角色有几种 我们必要的权限有几种
角色 分两种
ADMIN 管理员 :可管理商品
CUSTIOMER 普通用户 :
权限 分四种
BASIC 根本权限 :可欣赏商品
AUTU 已实名认证权限 :可下单支付
FROZEN 被冻结用户权限
NONE 没有任何权限
前置知识回顾
在阅读完 sa-token 的文档后
我发现原来权限验证云云简单
我们只必要 利用StpUtil即可
这个在开辟博客的时候写过相干的
- // 用户已存在,直接登录
- StpUtil.login(userInfo.getUserId(), new SaLoginModel().setIsLastingCookie(loginParam.getRememberMe())
- .setTimeout(DEFAULT_LOGIN_SESSION_TIMEOUT));
- // 将用户信息存入会话
- StpUtil.getSession().set(userInfo.getUserId().toString(), userInfo);
- // 创建登录结果对象
- LoginVO loginVO = new LoginVO(userInfo);
- // 返回登录成功响应
- return Result.success(loginVO);
复制代码
拿到UserInfo 用于自定义权限和角色的获取逻辑
我们在用 StpUtil 去拿这个登录信息
进行校验
很容易明白 我们在登录模块 放入了一个 UserInfo 对象进去
包罗了用户了信息
- package cn.hollis.nft.turbo.api.user.response.data;
- import cn.hollis.nft.turbo.api.user.constant.UserRole;
- import cn.hollis.nft.turbo.api.user.constant.UserStateEnum;
- import com.github.houbb.sensitive.annotation.strategy.SensitiveStrategyPhone;
- import lombok.Getter;
- import lombok.NoArgsConstructor;
- import lombok.Setter;
- import java.util.Date;
- /**
- * @author Hollis
- */
- @Getter
- @Setter
- @NoArgsConstructor
- public class UserInfo extends BasicUserInfo {
- private static final long serialVersionUID = 1L;
- /**
- * 手机号
- */
- @SensitiveStrategyPhone
- private String telephone;
- /**
- * 状态
- *
- * @see UserStateEnum
- */
- private String state;
- /**
- * 区块链地址
- */
- private String blockChainUrl;
- /**
- * 区块链平台
- */
- private String blockChainPlatform;
- /**
- * 实名认证
- */
- private Boolean certification;
- /**
- * 用户角色
- */
- private UserRole userRole;
- /**
- * 邀请码
- */
- private String inviteCode;
- /**
- * 注册时间
- */
- private Date createTime;
- public boolean userCanBuy() {
- if (this.getUserRole() != null && !this.getUserRole().equals(UserRole.CUSTOMER)) {
- return false;
- }
- // 判断买家状态
- if (this.getState() != null && !this.getState().equals(UserStateEnum.ACTIVE.name())) {
- return false;
- }
- // 判断买家状态
- if (this.getState() != null && !this.getCertification()) {
- return false;
- }
- return true;
- }
- }
复制代码 我们sa-token 提供的接口中重写权限校验方法
实现stpInterface 调用处理这个接口方法
我们就是再把这个对象拿出来
- // 根据用户登录ID和登录类型返回不同的权限列表
- UserInfo userInfo = (UserInfo) StpUtil.getSessionByLoginId(loginId).get((String) loginId);
复制代码 然后找到权限 返回摆列值
摆列值要包装成 list 类型
这边返回的是List类型
这些文档里都有...
- package cn.hollis.nft.turbo.gateway.auth;
- import cn.dev33.satoken.stp.StpInterface;
- import cn.dev33.satoken.stp.StpUtil;
- import cn.hollis.nft.turbo.api.user.constant.UserPermission;
- import cn.hollis.nft.turbo.api.user.constant.UserRole;
- import cn.hollis.nft.turbo.api.user.constant.UserStateEnum;
- import cn.hollis.nft.turbo.api.user.response.data.UserInfo;
- import org.springframework.stereotype.Component;
- import java.util.List;
- /**
- * 自定义权限验证接口实现类
- * StpInterface 接口用于自定义权限和角色的获取逻辑。
- * StpInterfaceImpl 类实现了 StpInterface 接口,通过用户的会话信息动态获取用户的权限和角色列表。
- * 在 Sa - Token 框架进行权限验证时,会调用该类的方法来确定用户是否具备相应的权限和角色。
- * 注意:这边通过用户会话信息动态获取用户权限和角色列表
- *
- * @author Hollis
- */
- @Component
- public class StpInterfaceImpl implements StpInterface {
- /**
- * 根据用户的登录 ID 和登录类型获取用户的权限列表
- *
- * @param loginId 用户的登录 ID
- * @param loginType 用户的登录类型
- * @return 用户的权限列表,以字符串集合形式返回
- */
- @Override
- public List<String> getPermissionList(Object loginId, String loginType) {
- // 从会话中根据登录 ID 获取用户信息
- UserInfo userInfo = (UserInfo) StpUtil.getSessionByLoginId(loginId).get((String) loginId);
- // 如果用户角色是管理员,或者用户状态为激活状态、已认证状态
- if (userInfo.getUserRole() == UserRole.ADMIN
- || userInfo.getState().equals(UserStateEnum.ACTIVE.name())
- || userInfo.getState().equals(UserStateEnum.AUTH.name()) ) {
- // 赋予用户基础权限和认证权限
- return List.of(UserPermission.BASIC.name(), UserPermission.AUTH.name());
- }
- // 如果用户状态为初始状态
- if (userInfo.getState().equals(UserStateEnum.INIT.name())) {
- // 赋予用户基础权限
- return List.of(UserPermission.BASIC.name());
- }
- // 如果用户状态为冻结状态
- if (userInfo.getState().equals(UserStateEnum.FROZEN.name())) {
- // 赋予用户冻结权限
- return List.of(UserPermission.FROZEN.name());
- }
- // 其他情况,赋予用户无权限
- return List.of(UserPermission.NONE.name());
- }
- /**
- * 根据用户的登录 ID 和登录类型获取用户的角色列表
- *
- * @param loginId 用户的登录 ID
- * @param loginType 用户的登录类型
- * @return 用户的角色列表,以字符串集合形式返回
- */
- @Override
- public List<String> getRoleList(Object loginId, String loginType) {
- // 从会话中根据登录 ID 获取用户信息
- UserInfo userInfo = (UserInfo) StpUtil.getSessionByLoginId(loginId).get((String) loginId);
- // 如果用户角色是管理员
- if (userInfo.getUserRole() == UserRole.ADMIN) {
- // 返回管理员角色
- return List.of(UserRole.ADMIN.name());
- }
- // 其他情况,返回普通用户角色
- return List.of(UserRole.CUSTOMER.name());
- }
- }
复制代码 最后进行要进行 satoken 过滤器全局配置
SaReactorFilter
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
|