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();
    }
}

分类: Sa-Token 标签: Sa-Token

评论

暂无评论数据

暂无评论数据

目录