# 认证回调

# 介绍

框架进行安全认证时,需要创建自定义的Realm,在认证过程中回调QmSecurityRealm中的方法进行业务拓展和基础认证。

Realm提供了权限校验,token校验,失败回调等拓展业务接口方法,借鉴于shiro理念,使之更加灵活。

# 回调接口

# noPassCallBack

void noPassCallBack(int type, 
                    HttpServletRequest request, 
                    HttpServletResponse response) throws Exception;
1
2
3

当安全检测不通过时回调该接口,回调该接口最好的处理方式是处理相关业务并推送错误信息。

该接口提供的参数为最常见的requestresponse

值得留意的是type参数,该参数回调的值决定回调的情况。

如下表所示:

type值 说明
1 检测不到token拒绝访问
2 非法token,token提取失败
3 授权验证拦截
4 权限不足,拒绝访问
5 token已经过期
6 无匹配404

# authorizationUserInfo

提供给调度者的检测用户是否合法的接口 当用户每次请求时进入安全监测时会调用该接口。 注意:当调度者返回null表示本次检测不通过,框架自动进行拦截,回调noPassCallBack方法type值为5。

QmUserInfo authorizationUserInfo(QmUserInfo qmUserInfo, 
                                 HttpServletRequest request, 
                                 HttpServletResponse response);
1
2
3

# authorizationMatchingURI

提供给调度者的授权URI接口,每次请求时会调用该方法进行URL授权,可相应的在该方法进行一些权限URL的封装,建议给方法内容进行一些缓存,提高访问效率。

List<String> authorizationMatchingURI(QmUserInfo qmUserInfo);
1

# verifyRestartToken

提供给调用者什么时候进行重置token。

默认机制为 当前时间 是否小于 (签发时间 + 失效时长 / 2)

tokenExpireTimetoken 的失效时间

signTimetoken 的签发时间

boolean verifyRestartToken(long tokenExpireTime, long signTime)
1

# 示例Demo

public class MyRealm implements QmSecurityRealm {

    @Override
    public List<String> authorizationMatchingURI(QmUserInfo qmUserInfo) {
        List<String> list = new ArrayList<>();
        list.add("/**");
        return list;
    }

    @Override
    public QmUserInfo authorizationUserInfo(QmUserInfo qmUserInfo, HttpServletRequest request, HttpServletResponse response) {
        return qmUserInfo;
    }

    @Override
    public void noPassCallBack(int type, HttpServletRequest request, HttpServletResponse response) throws Exception {
        response.getWriter().print("安全检测不通过!");
    }

    @Override
    public boolean verifyRestartToken(long tokenExpireTime, long signTime){
        // 如果exp等于0表示该token永久不过期
        if (tokenExpireTime <= 0) {
            return false;
        }
        // 机制为 当前时间 是否小于 (签发时间 + 失效时长 / 2)
        // 生成(签发时间 + 失效时长 / 2)的token过期时间
        Date tokenExp = new Date(signTime + (tokenExpireTime * 1000 / 2));
        if (System.currentTimeMillis() < tokenExp.getTime()) {
            return false;
        }
        return true;
    }
}

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
最近更新: 2020/2/10 上午11:32:05