2020-03-07 14:40:15 +08:00
|
|
|
|
# 注解式鉴权
|
|
|
|
|
---
|
|
|
|
|
|
2021-05-09 19:08:44 +08:00
|
|
|
|
有同学表示:尽管使用代码鉴权非常方便,但是我仍希望把鉴权逻辑和业务逻辑分离开来,我可以使用注解鉴权吗?当然可以!<br>
|
|
|
|
|
|
|
|
|
|
注解鉴权 —— 优雅的将鉴权与业务代码分离!
|
2020-03-07 14:40:15 +08:00
|
|
|
|
|
2021-06-19 00:00:57 +08:00
|
|
|
|
- `@SaCheckLogin`: 登录认证 —— 只有登录之后才能进入该方法
|
2021-06-19 01:38:37 +08:00
|
|
|
|
- `@SaCheckRole("admin")`: 角色认证 —— 必须具有指定角色标识才能进入该方法
|
|
|
|
|
- `@SaCheckPermission("user:add")`: 权限认证 —— 必须具有指定权限才能进入该方法
|
2021-06-19 00:00:57 +08:00
|
|
|
|
- `@SaCheckSafe`: 二级认证校验 —— 必须二级认证之后才能进入该方法
|
2021-08-31 01:03:25 +08:00
|
|
|
|
- `@SaCheckBasic`: HttpBasic认证 —— 只有通过 Basic 认证后才能进入该方法
|
2020-03-07 14:40:15 +08:00
|
|
|
|
|
2021-05-09 19:08:44 +08:00
|
|
|
|
Sa-Token使用全局拦截器完成注解鉴权功能,为了不为项目带来不必要的性能负担,拦截器默认处于关闭状态<br>
|
2021-06-19 01:38:37 +08:00
|
|
|
|
因此,为了使用注解鉴权,你必须手动将Sa-Token的全局拦截器注册到你项目中
|
2021-01-12 22:31:45 +08:00
|
|
|
|
|
2021-05-09 19:08:44 +08:00
|
|
|
|
<!-- Sa-Token内置两种模式完成注解鉴权,分别是`拦截器模式`和`AOP模式`, 为了避免不必要的性能浪费,这两种模式默认都处于关闭状态 <br>
|
|
|
|
|
因此如若使用注解鉴权,你必须选择其一进行注册 -->
|
2021-01-12 22:31:45 +08:00
|
|
|
|
|
|
|
|
|
|
2021-05-09 19:08:44 +08:00
|
|
|
|
### 1、注册拦截器
|
|
|
|
|
以`SpringBoot2.0`为例, 新建配置类`SaTokenConfigure.java`
|
2020-03-07 14:40:15 +08:00
|
|
|
|
|
2021-05-09 19:08:44 +08:00
|
|
|
|
``` java
|
|
|
|
|
@Configuration
|
|
|
|
|
public class SaTokenConfigure implements WebMvcConfigurer {
|
2021-06-19 01:38:37 +08:00
|
|
|
|
// 注册Sa-Token的注解拦截器,打开注解式鉴权功能
|
2021-05-09 19:08:44 +08:00
|
|
|
|
@Override
|
|
|
|
|
public void addInterceptors(InterceptorRegistry registry) {
|
2021-07-22 04:22:59 +08:00
|
|
|
|
// 注册注解拦截器,并排除不需要注解鉴权的接口地址 (与登录拦截器无关)
|
2021-05-09 19:08:44 +08:00
|
|
|
|
registry.addInterceptor(new SaAnnotationInterceptor()).addPathPatterns("/**");
|
|
|
|
|
}
|
|
|
|
|
}
|
2020-03-07 14:40:15 +08:00
|
|
|
|
```
|
2021-05-09 19:08:44 +08:00
|
|
|
|
保证此类被`springboot`启动类扫描到即可
|
2020-03-07 14:40:15 +08:00
|
|
|
|
|
|
|
|
|
|
2021-05-09 19:08:44 +08:00
|
|
|
|
### 2、使用注解鉴权
|
|
|
|
|
然后我们就可以愉快的使用注解鉴权:
|
2020-03-07 14:40:15 +08:00
|
|
|
|
|
|
|
|
|
``` java
|
2021-06-19 00:00:57 +08:00
|
|
|
|
// 登录认证:只有登录之后才能进入该方法
|
2021-02-12 01:57:31 +08:00
|
|
|
|
@SaCheckLogin
|
|
|
|
|
@RequestMapping("info")
|
|
|
|
|
public String info() {
|
|
|
|
|
return "查询用户信息";
|
|
|
|
|
}
|
2021-01-02 04:00:49 +08:00
|
|
|
|
|
2021-06-19 00:00:57 +08:00
|
|
|
|
// 角色认证:必须具有指定角色才能进入该方法
|
2021-02-12 01:57:31 +08:00
|
|
|
|
@SaCheckRole("super-admin")
|
|
|
|
|
@RequestMapping("add")
|
|
|
|
|
public String add() {
|
|
|
|
|
return "用户增加";
|
|
|
|
|
}
|
2021-01-02 04:00:49 +08:00
|
|
|
|
|
2021-06-19 00:00:57 +08:00
|
|
|
|
// 权限认证:必须具有指定权限才能进入该方法
|
2021-02-12 01:57:31 +08:00
|
|
|
|
@SaCheckPermission("user-add")
|
2021-06-19 00:00:57 +08:00
|
|
|
|
@RequestMapping("add")
|
|
|
|
|
public String add() {
|
|
|
|
|
return "用户增加";
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// 二级认证:必须二级认证之后才能进入该方法
|
|
|
|
|
@SaCheckSafe()
|
2021-02-12 01:57:31 +08:00
|
|
|
|
@RequestMapping("add")
|
|
|
|
|
public String add() {
|
|
|
|
|
return "用户增加";
|
|
|
|
|
}
|
2021-08-31 01:03:25 +08:00
|
|
|
|
|
|
|
|
|
// Http Basic 认证:只有通过 Basic 认证后才能进入该方法
|
|
|
|
|
@SaCheckBasic(account = "sa:123456")
|
|
|
|
|
@RequestMapping("add")
|
|
|
|
|
public String add() {
|
|
|
|
|
return "用户增加";
|
|
|
|
|
}
|
2020-03-07 14:40:15 +08:00
|
|
|
|
```
|
|
|
|
|
|
2021-05-09 19:08:44 +08:00
|
|
|
|
注:以上注解都可以加在类上,代表为这个类所有方法进行鉴权
|
2020-05-02 15:19:55 +08:00
|
|
|
|
|
|
|
|
|
|
2021-05-09 19:08:44 +08:00
|
|
|
|
### 3、设定校验模式
|
2021-01-02 04:00:49 +08:00
|
|
|
|
`@SaCheckRole`与`@SaCheckPermission`注解可设置校验模式,例如:
|
|
|
|
|
``` java
|
2021-02-12 01:57:31 +08:00
|
|
|
|
// 注解式鉴权:只要具有其中一个权限即可通过校验
|
|
|
|
|
@RequestMapping("atJurOr")
|
|
|
|
|
@SaCheckPermission(value = {"user-add", "user-all", "user-delete"}, mode = SaMode.OR)
|
|
|
|
|
public AjaxJson atJurOr() {
|
|
|
|
|
return AjaxJson.getSuccessData("用户信息");
|
|
|
|
|
}
|
2021-01-02 04:00:49 +08:00
|
|
|
|
```
|
|
|
|
|
|
2021-01-10 00:15:23 +08:00
|
|
|
|
mode有两种取值:
|
|
|
|
|
- `SaMode.AND`, 标注一组权限,会话必须全部具有才可通过校验
|
|
|
|
|
- `SaMode.OR`, 标注一组权限,会话只要具有其一即可通过校验
|
|
|
|
|
|
|
|
|
|
|
2021-10-11 01:09:28 +08:00
|
|
|
|
### 4、角色权限双重 “or校验”
|
|
|
|
|
假设有以下业务场景:一个接口在具体权限 `user-add` 或角色 `admin` 时可以调通。怎么写?
|
|
|
|
|
|
|
|
|
|
``` java
|
|
|
|
|
// 注解式鉴权:只要具有其中一个权限即可通过校验
|
|
|
|
|
@RequestMapping("userAdd")
|
|
|
|
|
@SaCheckPermission(value = "user-add", orRole = "admin")
|
|
|
|
|
public AjaxJson userAdd() {
|
|
|
|
|
return AjaxJson.getSuccessData("用户信息");
|
|
|
|
|
}
|
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
orRole 字段代表权限认证未通过时的次要选择,两者只要其一认证成功即可通过校验,其有三种写法:
|
|
|
|
|
- 写法一:`orRole = "admin"`,代表需要拥有角色 admin 。
|
|
|
|
|
- 写法二:`orRole = {"admin", "manager", "staff"}`,代表具有三个角色其一即可。
|
|
|
|
|
- 写法三:`orRole = {"admin, manager, staff"}`,代表必须同时具有三个角色。
|
|
|
|
|
|
2021-01-10 00:15:23 +08:00
|
|
|
|
|
2021-10-11 01:09:28 +08:00
|
|
|
|
### 5、在业务逻辑层使用注解鉴权
|
2021-05-09 19:08:44 +08:00
|
|
|
|
疑问:我能否将注解写在其它架构层呢,比如业务逻辑层?
|
2021-01-10 00:15:23 +08:00
|
|
|
|
|
2021-05-09 19:08:44 +08:00
|
|
|
|
使用拦截器模式,只能在`Controller层`进行注解鉴权,如需在任意层级使用注解鉴权,请参考:[AOP注解鉴权](/plugin/aop-at)
|
2021-01-10 00:15:23 +08:00
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
2021-01-02 04:00:49 +08:00
|
|
|
|
|