当使用shiro实现无状态应用程序时,是否需要登录每个请求?

当使用shiro实现无状态应用程序时,是否需要登录每个请求?,shiro,stateless,Shiro,Stateless,我使用shiro和jwt并尝试实现无状态web应用程序。 当我扩展authorizationrealm时,是否需要执行每个请求 这是我的executeLogin方法: public static boolean executeLogin(ServletRequest request) { HttpServletRequest httpServletRequest = (HttpServletRequest) request; String authorization = htt

我使用shiro和jwt并尝试实现无状态web应用程序。
当我扩展
authorizationrealm
时,是否需要
执行每个请求

这是我的
executeLogin
方法:

 public static boolean executeLogin(ServletRequest request) {
    HttpServletRequest httpServletRequest = (HttpServletRequest) request;
    String authorization = httpServletRequest.getHeader("Authorization");
    if (authorization == null || "".equals(authorization.trim())) {
        throw RequestException.fail("未含授权标示,禁止访问");
    }
    JwtToken token = new JwtToken(authorization, null, null);
    // 提交给realm进行登入,如果错误他会抛出异常并被捕获
    Subject subject = SecurityUtils.getSubject();
    try {
        subject.login(token);
    } catch (DisabledAccountException e) {
        if (e.getMessage().equals("verifyFail")) {
            throw new RequestException(ResponseCode.NOT_SING_IN.code, "身份已过期,请重新登录", e);
        }
        throw new RequestException(ResponseCode.SIGN_IN_INPUT_FAIL.code, e.getMessage(), e);
    } catch (Exception e) {
        e.printStackTrace();
        throw new RequestException(ResponseCode.SIGN_IN_FAIL, e);
    }
    // 如果没有抛出异常则代表登入成功,返回true
    return true;
}

领域在这里是错误的方法,因为根据定义,它通常与数据源有1对1的关联。实际上,您要做的是控制对服务器资源的访问,从客户端验证JWT。这可以通过读取授权头并在filters
isAccessAllowed
方法中验证其声明来完成。方法返回值定义是否允许访问


您根本不需要登录主题,因为
AccessControlFilter
决定是授予还是拒绝访问,或者将用户转发到请求的资源,或者重定向401-未经授权的响应。

是的,您应该为每个请求登录。这会将主题附加到当前线程,并允许您使用以下功能:例如使用authz的注释。

当您使用无状态调用时,您每次都必须登录并生成新主题,还必须使用适当的域加载授权详细信息

您可以尝试的另一个选项是,在成功登录后将主题放入缓存(ehCache),然后在每次请求时都可以从缓存中获取主题并用于授权。这将避免每次请求时都会出现登录和授权对象填充。但您必须确保在注销事件时从缓存中删除对象

一位用户已经在以下位置完成了类似的操作:


无状态意味着每个请求不依赖于前一个请求,但这并不意味着Shiro不使用会话

当用户成功登录时,Shiro会将一些cookie附加到HTTPResponse。当客户端向每个进一步的请求发送cookies时,Shiro会自动提取主题(将cookies与用户关联),因此,在代码中,您可以立即调用
SecurityUtils.getSubject()