注解文档
注意:关于@AuthCheck/@AuthControllerCheck/@AuthServiceCheck的用法有所更新,这份文档还能用,但是有些新的概念请到1.1.0.RELEASE新概念页面进行阅读。(主要是逻辑容器、权限码、mode那几块的知识点)
注解——@AuthControllerCheck/@AuthServiceCheck/@AuthCheck
这三个注解的具体用法在老版本中讲过,可以去看看。
但是在1.1.0.RELEASE之后,新增了注解隔离与注解优先级,其中Controller和Service注解是同级并且互斥的,另外@AuthCheck注解的优先级最大,如果类上有@AuthControllerCheck或者@AuthServiceCheck,同时,方法上有@AuthCheck注解,那么只会走@AuthCheck注解
下面对注解的几个参数来具体说一说:
Role和Permission
Role是角色,Permission是权限码
any和must
any是满足其中一个,must是全部满足
roleMode和permissionMode
分别用于控制anyRole和mustRole以及anyPermission和mustPermission,支持OR以及AND运算,默认都为AND运算
需要注意的是,role的判断逻辑和permission的判断逻辑是相互隔离的,其中一个满足就算通过,对于其他情况,比如:如果需要既满足role并且又要满足permission(或者其他更为复杂的鉴权逻辑),那么请重写doAuth接口即可
logicIndex
用于指定logic走向,填写bean在逻辑容器中的下标即可,默认为0,如果设置成Integer.MAX_INT,那么会将逻辑容器中的Bean都给走完。
@AuthPrimary
在1.1.0中新出的注解,标记负载中的主要字段,在KaSecurityAuthUtil中可以通过判断哪个字段存在该注解来获取该字段的值,用于控制上下线显示,建议使用唯一字段来进行表示
注意,在使用KaSecurityAuthUtil工具类时,尽量带上Class对象,否则可能会导致泛型擦除,最终转换为JsonObject对象
@AuthCheck
用于对某一特定的方法进行拦截,通常标记在接口函数上
- anyRole 拥有任一角色即可通过
- mustRole 必须包含所有角色才能通过
- onlyCheckLogin 当前接口是否仅检查登录
@AuthControllerCheck
用于对某些特定的方法进行拦截,通常标记在Controller层大类上
anyRole 拥有任一角色即可通过
mustRole 必须包含所有角色才能通过
onlyCheckLogin 当前接口是否仅检查登录
excludeMethods 排除的方法列表
由于方法名可能重复,所以每个方法的填写需要满足表达式:
方法名(参数类型 参数名...)
,有多少个参数就要填写多少个
@AuthServiceCheck
用于对某些特定的方法进行拦截,通常标记在Service层大类上,需要注意的是,当使用Dubbo作为远程调用时,当Servcie作为生产者,那么@AuthServiceCheck可能会失效,解决方法看下文
anyRole 拥有任一角色即可通过
mustRole 必须包含所有角色才能通过
onlyCheckLogin 当前接口是否仅检查登录
excludeMethods 排除的方法列表
由于方法名可能重复,所以每个方法的填写需要满足表达式:
方法名(参数类型 参数名...)
,有多少个参数就要填写多少个
鉴权失效的解决方法
实现Dubbo的拦截SPI即可
类我写好了,具体的xml还得各位自行配置,这个类的位置
package cn.katool.security.filter;
import cn.katool.constant.AuthConstant;
import cn.katool.util.auth.AuthUtil;
import com.alibaba.dubbo.common.Constants;
import org.apache.dubbo.common.extension.Activate;
import org.apache.dubbo.rpc.*;
import org.springframework.web.context.request.RequestContextHolder;
import org.springframework.web.context.request.ServletRequestAttributes;
@Activate(group = {Constants.PROVIDER})
public class DubboProviderAuthFilter implements Filter {
@Override
public Result invoke(Invoker<?> invoker, Invocation invocation) throws RpcException {
ServletRequestAttributes requestAttributes = (ServletRequestAttributes) RequestContextHolder.getRequestAttributes();
String token = AuthUtil.getToken(requestAttributes.getRequest());
RpcContext.getContext().setAttachment(AuthConstant.TOKEN_HEADER, token);
return invoker.invoke(invocation);
}
}
@EnableKaSecurityAuthCenter
用于分布式网关鉴权开启鉴权中心,本质上是开启了Dubbo和定时任务