栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

shiro放行失效,自定义注解实现接口跳过登录校验

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

shiro放行失效,自定义注解实现接口跳过登录校验

shiro放行失效,自定义注解实现接口跳过登录校验

文章目录
  • shiro放行失效,自定义注解实现接口跳过登录校验
    • shiro过滤器放行失败
    • 自定义@NoAuthentication注解放行接口
      • 1.新建一个NoAuthentication注解类
      • 2. 调用注解
      • 3.注解使用

shiro过滤器放行失败

起因是我shiro的过滤器不生效,所有接口都被拦截,直接进入jwtFilter超级烦啊,起笔之前还是没解决,shiroFilter如下:

 @Bean("shiroFilter")
    public ShiroFilterFactoryBean factory(DefaultWebSecurityManager securityManager) {
        System.out.println("------------------------------>执行请求过滤");
        ShiroFilterFactoryBean factoryBean = new ShiroFilterFactoryBean();
        // 添加自己的过滤器并且取名为jwt
        Map filterMap = new linkedHashMap<>(Constant.Number.ONE);
        filterMap.put("jwt", jwtFilter());
        factoryBean.setFilters(filterMap);
        factoryBean.setSecurityManager(securityManager);
        factoryBean.setUnauthorizedUrl("/401");

        Map filterRuleMap = new linkedHashMap<>(Constant.Number.TWO);
        filterRuleMap.put("/messageUI
@Target({ ElementType.METHOD }) //作用在方法上
@Retention(RetentionPolicy.RUNTIME) //运行时有效
@documented //可生成文档
public @interface NoAuthentication {
    
}
2. 调用注解

既然请求都进入isAccessAllowed,那我就在这个方法中添加注解调用,即进入该方法后,若方法有@NoAuthentication注解,则返回true直接放行,不进行登录校验

@Override
    protected boolean isAccessAllowed(ServletRequest request, ServletResponse response, Object mappedValue) {
        if (isLoginAttempt(request, response)) {
            
            HttpServletRequest httpServletRequest = (HttpServletRequest) request;
            WebApplicationContext ctx = RequestContextUtils.findWebApplicationContext(httpServletRequest);
            RequestMappingHandlerMapping mapping = ctx.getBean("requestMappingHandlerMapping", RequestMappingHandlerMapping.class);
            HandlerExecutionChain handler = null;
            try {
                handler = mapping.getHandler(httpServletRequest);
                Annotation[] declaredAnnotations = ((HandlerMethod) handler.getHandler()).getMethod().getDeclaredAnnotations();
                if (declaredAnnotations.length != 0) {
                    for (Annotation annotation : declaredAnnotations) {
                        
                        if (NoAuthentication.class.equals(annotation.annotationType())) {
                            return true;
                        }
                    }
                }
             
                // 执行登录
                executeLogin(request, response);
                Subject subject = getSubject(request, response);
                String[] perms = (String[]) mappedValue;
                boolean isPermitted = true;
                if (perms != null && perms.length > 0) {
                    if (perms.length == 1) {
                        if (!subject.isPermitted(perms[0])) {
                            isPermitted = false;
                        }

                    } else if (!subject.isPermittedAll(perms)) {
                        isPermitted = false;
                    }

                }
                return isPermitted;
            } catch (Exception e) {
                e.printStackTrace();
                responseTimeOut(request, response);
            }
        }
        return true;
    }
3.注解使用

就酱紫,直接在方法上加上即可实现放行

    @ApiOperation(value = "获取所有新闻(用户ui)")
    @GetMapping("/getList")
    @ResponseBody
    @CrossOrigin
    @NoAuthentication
    public Result getAllMessage() {
        QueryWrapper wrapper = new QueryWrapper<>();
        wrapper.eq("deleted", 1);
        List list = messageService.list(wrapper);
        //按发布日期倒序
        list.sort(Comparator.comparing(Message::getSendTime));
        Collections.reverse(list);
        return new Result<>().success().put(list);
    }
转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/657626.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号