Sa-Token

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 "登录失败";
    }

在这里插入图片描述
2.验证当前会话是否登录
顺便校验一下权限


    /**
     * 验证当前会话是否登录,同时对权限以及角色进行校验
     *
     * @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;
    }
}

在这里插入图片描述
3.退出登录
通过登录id退出登录,在校验是否还在登录状态

/**
     * 退出登录
     *
     * @param loginId
     * @return
     */
    @GetMapping("/exitLogin")
    public String exitLogin(String loginId) {
        StpUtil.logout(loginId);
        return loginId + "已退出登录";
    }

在这里插入图片描述
在这里插入图片描述
4.通过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";
        }
    }

在这里插入图片描述
5.获取当前会话token

 /**
     * 通过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+"已退出登录";
    }

在这里插入图片描述

Logo

为开发者提供学习成长、分享交流、生态实践、资源工具等服务,帮助开发者快速成长。

更多推荐