pom
<!-- Sa-Token 权限认证, 在线文档:http://sa-token.dev33.cn/ -->
<dependency>
<groupId>cn.dev33</groupId>
<artifactId>sa-token-spring-boot-starter</artifactId>
<version>1.28.0</version>
</dependency>
1.sa-token登录
@PostMapping("/doLogin")
public String login(String name, String password) {
if ("123456".equals(name) && password.equals("123456")) {
StpUtil.login(10001);
return "登录成功";
}
return "登录失败";
}
/**
* 验证当前会话是否登录,同时对权限以及角色进行校验
*
* @return
*/
@GetMapping("/isLogin")
public Map<String,Object> isLogin() {
// 拥有hash 判断check
Map<String,Object> stpMap=new HashMap<>();
// 判断:当前账号是否拥有指定角色, 返回true或false
StpUtil.hasRole("super-admin");
// 校验当前用户是否具有指定权限标识,如果验证未通过,则抛出异常NotRoleException
StpUtil.checkRole("super-admin");
// 校验当前账户是否具有全部角色标识,使用and必须全部验证通过
StpUtil.checkRoleAnd("super-admin","shop-admin");
// 校验:当前账号是否含有指定角色标识 [指定多个,只要其一验证通过即可] super-admin
StpUtil.checkRoleOr("super-admin","shop-admin");
// 判断 当前用户是否含有指定权限,返回true或false
StpUtil.hasPermission("user-update");
// 校验当前账户是否具有全部权限标识,使用and必须全部验证通过
StpUtil.checkPermissionAnd("user-update","user-add");
// 校验:当前账号是否含有指定角色标识 [指定多个,只要其一验证通过即可] user-update
StpUtil.checkPermissionAnd("user-update","user-add");
// 校验:当前账号是否含有指定权限, 如果验证未通过,则抛出异常: NotPermissionException
//权限校验,如果在Component中注释掉这个权限,访问的时候则会报无此权限
StpUtil.checkPermission("user-update");
stpMap.put("isLogin",StpUtil.isLogin());
stpMap.put("role",StpUtil.hasRole("super-admin"));
return stpMap;
}
权限代码
权限代码加入Component 即可,启动会自动扫描配置
/**
* @author Fetter
* @ClassName StpInterfaceImpl.java
* @Description 自定义权限验证接口扩展 Component保证此类被SpringBoot扫描,完成Sa-Token的自定义权限验证扩展
* @createTime 2021年12月21日 15:56:00
*/
@Component
public class StpInterfaceImpl implements StpInterface {
/**
* 返回一个账号所拥有的权限码集合
*/
@Override
public List<String> getPermissionList(Object o, String s) {
// 本list仅做模拟,实际项目中要根据具体业务逻辑来查询权限
List<String> list = new ArrayList<String>();
list.add("101");
list.add("user-add");
list.add("user-delete");
list.add("user-update");
list.add("user-get");
list.add("article-get");
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");
list.add("shop-admin");
return list;
}
}
/**
* 退出登录
*
* @param loginId
* @return
*/
@GetMapping("/exitLogin")
public String exitLogin(String loginId) {
StpUtil.logout(loginId);
return loginId + "已退出登录";
}
/**
* 通多登录id(loginId)判断是否登录
*
* @return
*/
@GetMapping("/queryUser")
public String queryUser() {
if (StpUtil.getLoginId().toString().isEmpty()) {
return "未登录,请登录!";
} else {
// 获取登录id
System.out.println(StpUtil.getLoginId().toString());
return "ok";
}
}
/**
* 通过loginId获取当前会话token
*
* @return
*/
@GetMapping("/getToken")
public String queryToken(String loginId) {
// 直接获取token
System.out.println(StpUtil.getTokenValue());
// 根据loginID获取token
System.out.println(StpUtil.getTokenValueByLoginId(loginId));
//获取token名称
System.out.println(StpUtil.getTokenName() + ":" + StpUtil.getTokenValue());
return StpUtil.getTokenValue();
}
6.踢人下线&强制注销&账号封禁
通过loginId强制踢人下线
所谓踢人下线,核心操作就是找到其指定loginId对应的token,并设置其失效
/**
* 强制踢人下线
*/
@GetMapping("/isLogout")
public String isLogOut(String loginId){
// 强制注销
// 强制指定登录loginId注销下线
StpUtil.logout(loginId);
// 强制指定账号在指定设备端注销下线
StpUtil.logout(loginId,"PC");
// 强制指定token注销下线
StpUtil.logoutByTokenValue(StpUtil.getTokenValue());
// 踢人下线
// 将指定登录loginId踢下线
StpUtil.kickout(loginId);
// 将指定登录loginId pc端踢下线
StpUtil.kickout(loginId,"PC");
// 将指定登录token踢下线
StpUtil.kickoutByTokenValue(StpUtil.getTokenValue());
// 区别 强制注销 和 踢人下线 的区别在于:
//
//强制注销等价于对方主动调用了注销方法,再次访问会提示:Token无效(清除token信息)。
//踢人下线不会清除Token信息,而是将其打上特定标记,再次访问会提示:Token已被踢下线
// 账号封禁
// 封禁指定账号
// 参数一:账号id
// 参数二:封禁时长,单位:秒 (86400秒=1天,此值为-1时,代表永久封禁)
StpUtil.disable(loginId,86400);
// 获取指定账号是否已被封禁 (true=已被封禁, false=未被封禁)
StpUtil.isDisable(10001);
// 获取指定账号剩余封禁时间,单位:秒
StpUtil.getDisableTime(10001);
// 解除封禁
StpUtil.untieDisable(loginId);
// 注意点
// 对于正在登录的账号,对其账号封禁时并不会使其立刻注销
// 如果需要将其封禁后立即掉线,可采取先踢再封禁的策略,例如:
StpUtil.kickout(loginId);
StpUtil.disable(loginId,-1);
return loginId+"已退出登录";
}