Sa-Token学习笔记-02
Sa-Token学习笔记-02
权限认证
所谓权限认证,核心逻辑就是判断一个账号是否拥有指定权限:
- 有,就让你通过。
- 没有?那么禁止访问!
深入到底层数据中,就是每个账号都会拥有一组权限码集合,框架来校验这个集合中是否包含指定的权限码。
例如:当前账号拥有权限码集合 ["user-add", "user-delete", "user-get"]
,这时候我来校验权限 "user-update"
,则其结果就是:验证失败,禁止访问。
新建一个类,实现 StpInterface
接口,例如以下代码:
package com.hayaizo.satoken.saToken;
import cn.dev33.satoken.stp.StpInterface;
import org.springframework.stereotype.Component;
import java.util.ArrayList;
import java.util.List;
/**
* @author moxiao
*/
@Component
public class StpInterfaceImpl implements StpInterface {
@Override
public List<String> getPermissionList(Object loginId, String loginType) {
// 本list仅做模拟,实际项目中要根据具体业务逻辑来查询权限
List<String> list = new ArrayList<String>();
list.add("101");
list.add("user.add");
list.add("user.update");
list.add("user.get");
// list.add("user.delete");
list.add("art.*");
return list;
}
@Override
public List<String> getRoleList(Object o, String s) {
// 本list仅做模拟,实际项目中要根据具体业务逻辑来查询角色
List<String> list = new ArrayList<String>();
list.add("admin");
list.add("super-admin");
return list;
}
}
- loginId:账号id,即你在调用
StpUtil.login(id)
时写入的标识值。 - loginType:账号体系标识,此处可以暂时忽略,在 [ 多账户认证 ] 章节下会对这个概念做详细的解释。
权限校验
接下来就可以用下面的API来进行鉴权了
// 获取:当前账号所拥有的权限集合
StpUtil.getPermissionList();
// 判断:当前账号是否含有指定权限, 返回 true 或 false
StpUtil.hasPermission("user.add");
// 校验:当前账号是否含有指定权限, 如果验证未通过,则抛出异常: NotPermissionException
StpUtil.checkPermission("user.add");
// 校验:当前账号是否含有指定权限 [指定多个,必须全部验证通过]
StpUtil.checkPermissionAnd("user.add", "user.delete", "user.get");
// 校验:当前账号是否含有指定权限 [指定多个,只要其一验证通过即可]
StpUtil.checkPermissionOr("user.add", "user.delete", "user.get");
扩展:NotPermissionException
对象可通过 getLoginType()
方法获取具体是哪个 StpLogic
抛出的异常
角色验证
// 获取:当前账号所拥有的角色集合
StpUtil.getRoleList();
// 判断:当前账号是否拥有指定角色, 返回 true 或 false
StpUtil.hasRole("super-admin");
// 校验:当前账号是否含有指定角色标识, 如果验证未通过,则抛出异常: NotRoleException
StpUtil.checkRole("super-admin");
// 校验:当前账号是否含有指定角色标识 [指定多个,必须全部验证通过]
StpUtil.checkRoleAnd("super-admin", "shop-admin");
// 校验:当前账号是否含有指定角色标识 [指定多个,只要其一验证通过即可]
StpUtil.checkRoleOr("super-admin", "shop-admin");
测试代码
package com.hayaizo.satoken.controller;
import cn.dev33.satoken.stp.StpUtil;
import cn.dev33.satoken.util.SaResult;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import java.util.List;
/**
* @author moxiao
*/
@RestController
@RequestMapping("/permission/")
public class PermissionController {
@RequestMapping("add")
public SaResult add() {
StpUtil.checkPermission("user.add");
return SaResult.ok();
}
@RequestMapping("delete")
public SaResult delete() {
StpUtil.checkPermission("user.delete");
return SaResult.ok();
}
@RequestMapping("art")
public SaResult art() {
StpUtil.checkPermission("art.art");
return SaResult.ok();
}
@RequestMapping("all")
public SaResult all() {
List<String> permissionList = StpUtil.getPermissionList();
return SaResult.data(permissionList);
}
@RequestMapping("role")
public SaResult role() {
StpUtil.checkRole("super-admin");
return SaResult.ok();
}
}
踢人下线
测试代码
package com.hayaizo.satoken.controller;
import cn.dev33.satoken.stp.StpUtil;
import cn.dev33.satoken.util.SaResult;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
/**
* @author moxiao
*/
@RestController
@RequestMapping("/kickout/")
public class kickoutController {
/*
* 前提:首先调用登录接口进行登录,代码在 com.pj.cases.use.LoginAuthController 中有详细解释,此处不再赘述
* ---- http://localhost:8081/acc/doLogin?username=zhang&password=123456
*/
// 将指定账号强制注销 ---- http://localhost:8081/kickout/logout?userId=10001
@RequestMapping("logout")
public SaResult logout(long userId){
// 强制注销,直接让Token无效
StpUtil.logout(userId);
// 返回
return SaResult.ok();
}
// 让指定账号踢下线
@RequestMapping("kickout")
public SaResult kickout(long userId){
StpUtil.kickout(userId);
// 返回
return SaResult.ok();
}
/*
* 你可以分别在强制注销和踢人下线后,再次访问一下登录校验接口,对比一下两者返回的提示信息有何不同
* ---- http://localhost:8081/acc/checkLogin
*/
// 根据 Token 值踢人 ---- http://localhost:8081/kickout/kickoutByTokenValue?tokenValue=xxxx-xxxx-xxxx-xxxx已登录账号的token值
@RequestMapping("kickoutByTokenValue")
public SaResult kickoutByTokenValue(String tokenValue) {
StpUtil.kickoutByTokenValue(tokenValue);
// 返回
return SaResult.ok();
}
}
版权申明
本文系作者 @hayaizo 原创发布在Hello World站点。未经许可,禁止转载。
暂无评论数据