SpringBoot-Shiro-问题记录

2022-09-11  本文已影响0人  唔哒喂

逻辑

ps:本次代码无法使用统一异常处理
1、部分接口设置白名单,从而不走自定义Filter
2、其余所有的接口请求都要走自定义Filter
3、所有的Shiro异常都用自定义异常
4、当捕捉到异常后,用一次请求转发,来将异常返回给前端。

引入包:shiro-redis。目前来看shiro-redis和单独的shiro差不多

前后端分离。
使用的Shiro网上找一下配置,大同小异。


image.png

问题记录

1、白名单配置异常

ShiroConfig中配置白名单时,可能没有效果。原因是ShiroConfig的配置问题。
PS:在网络上的有些文档中,不会出这种问题。

解决:

需要在添加过滤器的配置中,加入原本Shiro自带的过滤器

image.png

添加白名单配置如下:


image.png

2、抛出异常报错。使用PostMan进行测试时,返回一个html

解决:重写isAccessAllowed

网上大部分的代码不是重写这个,就是重写onAccessDenied。
从Debug、其他资料看得出二者的关系是,is先行,按照is执行情况来执行on。当is返回true,不执行OnAccessDenied。

这里有三个重要自定义
1、ServiceException,一个自定义Exception,用这个Exception,来抛出所有的异常,比如token过期、用户不存在等等等等。【全部在Realm中处理】
2、将异常转发到接口,即执行executeLogin碰到的接口
3、executeLogin。在Realm中进行处理,分权限或者登录的处理了。目前只试过登录

 @Override
    protected boolean isAccessAllowed(ServletRequest request, ServletResponse response, Object mappedValue) {
        try {
            executeLogin(request, response);
        } catch (Exception e) {
            ServiceException e1 = (ServiceException) e.getCause();
            // 转发异常到自定义接口
            responseError(response, e1.getMessage(), e1.getCode());
        }
        return true;
    }

    @Override
    protected boolean executeLogin(ServletRequest request, ServletResponse response) {
        HttpServletRequest httpServletRequest = (HttpServletRequest) request;
        String authorization = getAuthorization(httpServletRequest); // 自定义取token。放Header就取Header
        JwtToken jwtToken = new JwtToken(authorization);
        getSubject(request, response).login(jwtToken); // 调用Realm来进行处理
        return true;
    }

    /**
     * 异常处理,转发数据到接口
     * 重定向的接口,需要添加到白名单
     */
    private void responseError(ServletResponse response, String message, int errCode) {
        try {
            HttpServletResponse httpServletResponse = (HttpServletResponse) response;
            message = URLEncoder.encode(message, "UTF-8");
            httpServletResponse.sendRedirect("/user/shiro/error/" + message + "/" + errCode);
        } catch (IOException e) {
            log.error(e.getMessage());
        }
    }
上一篇 下一篇

猜你喜欢

热点阅读