权限控制
TIP
- 权限框架:Sa-Token
- 一个轻量级 java 权限认证框架,让鉴权变得简单、优雅!
权限符-权限校验
@SaCheckPermission
注解是由 Sa-Token 框架提供的角色校验注解,可以标注在方法上或类上。
- 单个权限校验:
java
//权限
@SaCheckPermission("system:user:list")
//角色
@SaCheckRole("superadmin")
- 多个权限校验(或模式,满足任意一个权限即可):
java
//权限
@SaCheckPermission(
value = {
"system:user:list",
"system:user:query"
},
mode = SaMode.OR
)
//角色
@SaCheckRole(
value = {
"superadmin",
"admin"
},
mode = SaMode.OR
)
- 多个权限校验(与模式,必须满足所有权限):
java
//权限
@SaCheckPermission(
value = {
"system:user:list",
"system:user:query"
},
mode = SaMode.AND
)
//角色
SaCheckRole(
value = {
"superadmin",
"admin"
},
mode = SaMode.AND
)
工具类权-权限校验
StpUtil
工具类是由 Sa-Token 框架提供的权限工具类,提供了常用的校验方法。
- 判断当前用户是否拥有某个权限(返回 boolean):
java
//权限
StpUtil.hasPermission("system:user:list");
//角色
StpUtil.hasRole("superadmin")
- 单个权限校验:
java
//权限
StpUtil.checkPermission("system:user:list");
//角色
StpUtil.checkRoleOr("system:user:list", "system:user:query");
CAUTION
如果验证未通过,则抛出异常: NotPermissionException,NotRoleException
- 多个权限校验(或模式,满足任意一个权限即可):
java
//权限
StpUtil.checkPermissionOr("system:user:list", "system:user:query");
//角色
StpUtil.checkRoleAnd("system:user:list", "system:user:query");
CAUTION
如果验证未通过,则抛出异常: NotPermissionException,NotRoleException
- 多个权限校验(与模式,必须满足所有权限):
java
StpUtil.checkPermissionAnd("system:user:list", "system:user:query");
CAUTION
如果验证未通过,则抛出异常: NotPermissionException,NotRoleException
双重权限角色验证
除了分开校验以外,权限和角色也可以进行组合,表示备选校验。
简单举个例子:
假设某个 API 的权限码为 system:user:list,角色 admin 可以调用,则可以这样写:
java
@SaCheckPermission(value = "system:user:list", orRole = "admin")
CAUTION
如果验证未通过,则抛出异常: NotPermissionException,NotRoleException
忽略权限校验
请参考文档:接口放行
登录对象
- 当前用户登录状态
java
Boolean isLogin = LoginObject.isLogin();
- 获取当前登录用户ID
java
String userId = LoginObject.getLoginId();
- 获取当前登录用户
java
SysUserVo sysUserVo = LoginObject.getLoginObject(SysUserVo.class);
- 更多方法
请查看:LoginObject.java
- Sa-Token Api
TIP
text
// 获取:当前账号所拥有的权限集合
//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");
// 获取:当前账号所拥有的角色集合
//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");
//StpUtil.logout(10001); // 强制指定账号注销下线
//StpUtil.logout(10001, "PC"); // 强制指定账号指定端注销下线
//StpUtil.logoutByTokenValue("token"); // 强制指定 Token 注销下线
//StpUtil.kickout(10001); // 将指定账号踢下线
//StpUtil.kickout(10001, "PC"); // 将指定账号指定端踢下线
//StpUtil.kickoutByTokenValue("token"); // 将指定 Token 踢下线
// 登录校验:只有登录之后才能进入该方法
//@SaCheckLogin
//写法一:orRole = "admin",代表需要拥有角色 admin 。
//写法二:orRole = {"admin", "manager", "staff"},代表具有三个角色其一即可。
//写法三:orRole = {"admin, manager, staff"},代表必须同时具有三个角色。
// 角色权限双重 “or校验”:具备指定权限或者指定角色即可通过校验
//@SaCheckRole(value = "user.add", orRole = "admin")
// 权限校验:必须具有指定权限才能进入该方法
// 注解式鉴权:只要具有其中一个权限即可通过校验
//@SaCheckPermission(value = {"user-add", "user-all", "user-delete"}, mode = SaMode.OR)
// 二级认证校验:必须二级认证之后才能进入该方法
// 此接口加上了 @SaIgnore 可以游客访问
//@SaIgnore
//@SaCheckSafe()
// Http Basic 校验:只有通过 Basic 认证后才能进入该方法
//@SaCheckBasic(account = "sa:123456")
// 校验当前账号是否被封禁 comment 服务,如果已被封禁会抛出异常,无法进入方法
//@SaCheckDisable("comment")
// 在 `@SaCheckOr` 中可以指定多个注解,只要当前会话满足其中一个注解即可通过验证,进入方法。
// 当前客户端只要有 [ login 账号登录] 或者 [user 账号登录] 其一,就可以通过验证进入方法。
//@SaCheckOr(
// login = { @SaCheckLogin(type = "login"), @SaCheckLogin(type = "user") }
// role = @SaCheckRole("admin"),
// permission = @SaCheckPermission("user.add"),
// safe = @SaCheckSafe("update-password"),
// basic = @SaCheckBasic(account = "sa:123456"),
// disable = @SaCheckDisable("submit-orders")
// )
// 获取当前账号 id 的 Account-Session (必须是登录后才能调用)
//StpUtil.getSession();
// 获取当前账号 id 的 Account-Session, 并决定在 Session 尚未创建时,是否新建并返回
//StpUtil.getSession(true);
// 获取账号 id 为 10001 的 Account-Session
//StpUtil.getSessionByLoginId(10001);
// 获取账号 id 为 10001 的 Account-Session, 并决定在 Session 尚未创建时,是否新建并返回
//StpUtil.getSessionByLoginId(10001, true);
// 获取 SessionId 为 xxxx-xxxx 的 Account-Session, 在 Session 尚未创建时, 返回 null
//StpUtil.getSessionBySessionId("xxxx-xxxx");
// 获取当前 Token 的 Token-Session 对象
//StpUtil.getTokenSession();
// 获取指定 Token 的 Token-Session 对象
//StpUtil.getTokenSessionByToken(token);
// 查询指定key的Session是否存在
//SaSessionCustomUtil.isExists("goods-10001");
// 获取指定key的Session,如果没有,则新建并返回
//SaSessionCustomUtil.getSessionById("goods-10001");
// 获取指定key的Session,如果没有,第二个参数决定是否新建并返回
//SaSessionCustomUtil.getSessionById("goods-10001", false);
// 删除指定key的Session
//SaSessionCustomUtil.deleteSessionById("goods-10001");
// 写值
//session.set("name", "zhang");
// 写值 (只有在此key原本无值的时候才会写入)
//session.setDefaultValue("name", "zhang");
// 取值
//session.get("name");
// 取值 (指定默认值)
//session.get("name", "<defaultValue>");
// 取值 (若无值则执行参数方法, 之后将结果保存到此键名下,并返回此结果 若有值则直接返回, 无需执行参数方法)
//session.get("name", () -> {
// return ...;
// });
// ---------- 数据类型转换: ----------
//session.getInt("age"); // 取值 (转int类型)
//session.getLong("age"); // 取值 (转long类型)
//session.getString("name"); // 取值 (转String类型)
//session.getDouble("result"); // 取值 (转double类型)
//session.getFloat("result"); // 取值 (转float类型)
//session.getModel("key", Student.class); // 取值 (指定转换类型)
//session.getModel("key", Student.class, <defaultValue>); // 取值 (指定转换类型, 并指定值为Null时返回的默认值)
// 是否含有某个key (返回 true 或 false)
//session.has("key");
// 删值
//session.delete('name');
// 清空所有值
//session.clear();
// 获取此 Session 的所有key (返回Set<String>)
//session.keys();
// 获取当前 Token 的匿名 Token-Session (可在未登录情况下使用的 Token-Session)
//StpUtil.getAnonTokenSession();