美文网首页
SpringBoot-Shiro-问题记录

SpringBoot-Shiro-问题记录

作者: 唔哒喂 | 来源:发表于2022-09-11 02:49 被阅读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());
        }
    }

相关文章

  • SpringBoot-Shiro-问题记录

    逻辑 ps:本次代码无法使用统一异常处理1、部分接口设置白名单,从而不走自定义Filter2、其余所有的接口请求都...

  • 记录问题

    iOS11 之后,添加导航栏之后,视图添加在self.view 上面之后,视图的位置是0 0 开始的,结果视图添加...

  • 【问题记录】问题记录专用

    【监听WebView点击事件】日期:2018.06.06 问题描述:使用WebViewClient中的should...

  • 文集序

    用于记录处理过 ubuntu 问题 用于记录处理过 windows 问题 用于记录处理过手机操作系统问题 用于记录...

  • 问题记录

    pip 安装包问题 问题描述:pip install 安装whl文件报错错误信息:UnicodeEncodeErr...

  • 问题记录

    1 使用Keras中自带的MNIST数据集的时候提示不存在 解决办法:直接复制这里提示的下载地址,下载匹配的mni...

  • 问题处理记录

    【Java】java mail Domain contains control or whitespace 异常描...

  • 问题记录

    问题一,打卡刷屏问题 回答人:奶爸 第一互动性强。 第二群反馈。 其他软件,易效能软件更早,但目前不能完成其他信息...

  • 问题记录

    . MKMapView 疑似无法释放 . UITableView 顶部偏移问题 . NSTimer 刷新 UIBu...

  • 问题记录

    useLibrary'org.apache.http.legacy' I libprocessgroup: Kil...

网友评论

      本文标题:SpringBoot-Shiro-问题记录

      本文链接:https://www.haomeiwen.com/subject/ntisgrtx.html