它的作用是用来根据路径匹配结果,调用相应过滤器

onPreHandle

这里是正在的执行逻辑,之前的都是判断,它返回了两个方法:

  • isAccessAllowed()
  • onAccessDenied()

​ 这两个方法通过||运算符连接,其实有一个逻辑判断过程【先判断isAccessAllowed:访问是否允许,如果允许则通过,如果不允许则进行onAccessDenied:访问拒绝处理的逻辑】。

isAccessAllowed

private boolean isAccessAllowed(ServletRequest request, ServletResponse response, Object mappedValue) {
Subject subject = getSubject(request, response);
//获取Subject,然后调用isAuthenticated()判断是否已经认证过了
return subject.isAuthenticated();
}

​ 如果上面isAuthenticated为false,那么需要继续判断是否是!isLoginRequest()非登录请求,且isPermissive()是放行的,也就是说判断是否是匿名访问路径。

onAccessDenied

private boolean onAccessDenied(ServletRequest request, ServletResponse response) throws Exception {
boolean loggedIn = false; // false by default or we wouldn't be in this method
if (isLoginAttempt(request, response)) {
loggedIn = executeLogin(request, response);
}
if (!loggedIn) {
sendChallenge(request, response);
}
return loggedIn;
}

该方法就是isAccessAllowed返回false之后执行的,即访问拒绝的逻辑

​ isLoginAttempt(),该方法前面已经出现,通过请求头判断是否为尝试登陆,如果 true,则执行登录逻辑;反之,sendChallenge

executeLogin

​ BasicHttpAuthenticationFilter 是没有实现 executeLogin() 的,因此将调用父类 AuthenticatingFilter 的 executeLogin() 方法。

private boolean executeLogin(ServletRequest request, ServletResponse response) throws Exception {
AuthenticationToken token = createToken(request, response);
if (token == null) {
String msg = "createToken method implementation returned null. A valid non-null AuthenticationToken " +
"must be created in order to execute a login attempt.";
throw new IllegalStateException(msg);
}
try {
Subject subject = getSubject(request, response);
subject.login(token);
return onLoginSuccess(token, subject, request, response);
} catch (AuthenticationException e) {
return onLoginFailure(token, e, request, response);
}
} private AuthenticationToken createToken(ServletRequest request, ServletResponse response) {
String authorizationHeader = getAuthzHeader(request);
if (authorizationHeader == null || authorizationHeader.length() == 0) {
// 由于没有授权标头,请创建空的身份验证令牌。
return createToken("", "", request, response);
} log.debug("Attempting to execute login with auth header"); String[] prinCred = getPrincipalsAndCredentials(authorizationHeader, request);
if (prinCred == null || prinCred.length < 2) {
// 创建一个密码为空的身份验证令牌,因为请求中没有提供。
String username = prinCred == null || prinCred.length == 0 ? "" : prinCred[0];
return createToken(username, "", request, response);
} String username = prinCred[0];
String password = prinCred[1]; return createToken(username, password, request, response);
}

​ 在 createToken 之后,会使用getSubject执行login()。后面会执行securityManager的login方法,在securityManager中会对 token进行验证,本质上就是调用Realm方法验证,如果验证过程中没有异常抛出,则顺利执行。

Shiro-BasicHttpAuthenticationFilter 鉴权过滤器的使用方式的更多相关文章

  1. Shiro的鉴权方式

    一. 怎么用 Shiro 支持三种方式的授权 编程式:通过写 if/else 授权代码块完成: Subject subject = SecurityUtils.getSubject(); if(sub ...

  2. springcloud zuul shiro网关鉴权并向服务传递用户信息

    1.pom文件 <dependencies> <!--eureka客户端--> <dependency> <groupId>org.springfram ...

  3. shiro jwt 构建无状态分布式鉴权体系

    一:JWT 1.令牌构造 JWT(json web token)是可在网络上传输的用于声明某种主张的令牌(token),以JSON 对象为载体的轻量级开放标准(RFC 7519). 一个JWT令牌的定 ...

  4. Shiro(4)默认鉴权与自定义鉴权

    =========默认鉴权======== 过滤链中定义: <!-- 过滤链定义 --> <property name="filterChainDefinitions&qu ...

  5. .NET Core中的鉴权授权正确方式(.NET5)

    一.简介 前后端分离的站点一般都会用jwt或IdentityServer4之类的生成token的方式进行登录鉴权.这里要说的是小项目没有做前后端分离的时站点登录授权的正确方式. 一.传统的授权方式 这 ...

  6. 【Spring Cloud & Alibaba 实战 | 总结篇】Spring Cloud Gateway + Spring Security OAuth2 + JWT 实现微服务统一认证授权和鉴权

    一. 前言 hi,大家好~ 好久没更文了,期间主要致力于项目的功能升级和问题修复中,经过一年时间的打磨,[有来]终于迎来v2.0版本,相较于v1.x版本主要完善了OAuth2认证授权.鉴权的逻辑,结合 ...

  7. Mongodb 认证鉴权那点事

    [TOC] 一.Mongodb 的权限管理 认识权限管理,说明主要概念及关系 与大多数数据库一样,Mongodb同样提供了一套权限管理机制. 为了体验Mongodb 的权限管理,我们找一台已经安装好的 ...

  8. SpringBoot系列: Web应用鉴权思路

    ==============================web 项目鉴权============================== 主要的鉴权方式有:1. 用户名/密码鉴权, 然后通过 Sess ...

  9. SpringCloud 2020.0.4 系列之 JWT用户鉴权

    1. 概述 老话说的好:善待他人就是善待自己,虽然可能有所付出,但也能得到应有的收获. 言归正传,之前我们聊了 Gateway 组件,今天来聊一下如何使用 JWT 技术给用户授权,以及如果在 Gate ...

  10. Python 计算AWS4签名,Header鉴权与URL鉴权

    AWS4 版本签名计算参考 #!/usr/bin/env python3 # -*- coding:utf-8 -*- # @Time: 2021/7/24 8:12 # @Author:zhangm ...

随机推荐

  1. Android Qcom USB Driver学习(十二)

    keypad 在suspend的过程中导致Android无法进入suspend的问题,导致整体功耗过高,其实是主机都没有进入睡眠,通过以下打log的方式最终定位到问题,pmic vbus输出的时候会有 ...

  2. os.environ["CUDA_DEVICE_ORDER"] = '0'

    这个总结来自:博客 os.environ["CUDA_DEVICE_ORDER"] = "PCI_BUS_ID" # 按照PCI_BUS_ID顺序从0开始排列G ...

  3. es6有哪些新特性?

    1. let 和 ocnst ,可以定义块级作用域 2. 新增了箭头函数,箭头函数简化了函数定义的定义 3.新增了promise解决回调地狱问题 ps:回调地狱是我们异步请求服务器数据时,通过then ...

  4. 工作使用:Exchange命令集(超级重要)

    工作使用:Exchange命令集(超级重要) 命令1:导出某个用户的邮件                  New-MailboxExportRequest   -mailbox  dusonglin ...

  5. C# .netcore NPOI库 实现报表的列自适应删减

    实际需求:业务上的一个需求,数据库表A中的B字段存放的是该条数据的一些标签,标签存在两级[即一级标签和二级标签], 现在要是实现将这些标签统计到报表中,一级标签作为表头,二级标签作为填充值. 由于之前 ...

  6. KubeSphere 开源 KubeEye:Kubernetes 集群自动巡检工具

    为什么开源 KubeEye Kubernetes 作为容器编排的事实标准,虽然架构优雅功能也非常强大,但是 Kubernetes 在日常运行过程中总会有一些疑难杂症和隐性的问题让集群管理员和 Yaml ...

  7. Visual Studio 2022只能使用WSL调试问题处理

    删除项目的Properties目录下面的launchSettings.json文件

  8. 在 Kubernetes 中运行 Locust 与 Selenium:安装 Chrome 和 ChromeDriver

    在现代软件开发中,性能和用户体验是至关重要的,而负载测试和自动化测试可以帮助我们实现这一目标.在本文中,我们将讨论如何在 Kubernetes 环境中运行 Locust 和 Selenium,并详细介 ...

  9. python 爬虫如何爬取动态生成的网页内容

    ---  好的方法很多,我们先掌握一种  --- [背景] 对于网页信息的采集,静态页面我们通常都可以通过python的request.get()库就能获取到整个页面的信息. 但是对于动态生成的网页信 ...

  10. Centos7系统docker部署Ferry工单系统

    1.更新yum源国内阿里1.1备份当前yum仓库配置sudo cp /etc/yum.repos.d/CentOS-Base.repo /etc/yum.repos.d/CentOS-Base.rep ...