Shiro-BasicHttpAuthenticationFilter 鉴权过滤器的使用方式
它的作用是用来根据路径匹配结果,调用相应过滤器
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 鉴权过滤器的使用方式的更多相关文章
- Shiro的鉴权方式
一. 怎么用 Shiro 支持三种方式的授权 编程式:通过写 if/else 授权代码块完成: Subject subject = SecurityUtils.getSubject(); if(sub ...
- springcloud zuul shiro网关鉴权并向服务传递用户信息
1.pom文件 <dependencies> <!--eureka客户端--> <dependency> <groupId>org.springfram ...
- shiro jwt 构建无状态分布式鉴权体系
一:JWT 1.令牌构造 JWT(json web token)是可在网络上传输的用于声明某种主张的令牌(token),以JSON 对象为载体的轻量级开放标准(RFC 7519). 一个JWT令牌的定 ...
- Shiro(4)默认鉴权与自定义鉴权
=========默认鉴权======== 过滤链中定义: <!-- 过滤链定义 --> <property name="filterChainDefinitions&qu ...
- .NET Core中的鉴权授权正确方式(.NET5)
一.简介 前后端分离的站点一般都会用jwt或IdentityServer4之类的生成token的方式进行登录鉴权.这里要说的是小项目没有做前后端分离的时站点登录授权的正确方式. 一.传统的授权方式 这 ...
- 【Spring Cloud & Alibaba 实战 | 总结篇】Spring Cloud Gateway + Spring Security OAuth2 + JWT 实现微服务统一认证授权和鉴权
一. 前言 hi,大家好~ 好久没更文了,期间主要致力于项目的功能升级和问题修复中,经过一年时间的打磨,[有来]终于迎来v2.0版本,相较于v1.x版本主要完善了OAuth2认证授权.鉴权的逻辑,结合 ...
- Mongodb 认证鉴权那点事
[TOC] 一.Mongodb 的权限管理 认识权限管理,说明主要概念及关系 与大多数数据库一样,Mongodb同样提供了一套权限管理机制. 为了体验Mongodb 的权限管理,我们找一台已经安装好的 ...
- SpringBoot系列: Web应用鉴权思路
==============================web 项目鉴权============================== 主要的鉴权方式有:1. 用户名/密码鉴权, 然后通过 Sess ...
- SpringCloud 2020.0.4 系列之 JWT用户鉴权
1. 概述 老话说的好:善待他人就是善待自己,虽然可能有所付出,但也能得到应有的收获. 言归正传,之前我们聊了 Gateway 组件,今天来聊一下如何使用 JWT 技术给用户授权,以及如果在 Gate ...
- Python 计算AWS4签名,Header鉴权与URL鉴权
AWS4 版本签名计算参考 #!/usr/bin/env python3 # -*- coding:utf-8 -*- # @Time: 2021/7/24 8:12 # @Author:zhangm ...
随机推荐
- 进程D 状态的产生及原因解释
在 Linux 系统中,进程的 D 状态表示进程处于不可中断的睡眠状态 (Uninterruptible Sleep).这种状态通常由进程等待某些资源或事件引起,这些资源或事件无法立即可用.以下是一些 ...
- Android dtbo(3) 编译和验证
您可以使用设备树编译器 (DTC) 编译设备树源文件.不过,在将叠加层 DT 应用于目标主 DT 之前,您还应该通过模拟 DTO 的行为来验证结果. 1. 通过DTC进行编译 构建主 DT .dts ...
- .Net Core 的 using 作用
// using 的使用 // 1. 引用命名空间 using namespace // 2. 自动释放资源 执行结束自动调用 IDispose 接口释放资源 // using (var contex ...
- js的作用域有哪些 and 他们的特点
全局作用域:是所有代码的执行环境,比如script标签里所有的代码 或 独立的js 文件: 局部作用域:是函数内部代码的执行环境: 块级作用域:是 {} 内的代码执行环境:
- logback.xml文件
<?xml version = "1.0" encoding="UTF-8"?> <configuration debug = "f ...
- Oracle ASM 常用巡检脚本
1.查看磁盘组 sqlplus "/ as sysasm" set line 200 set pagesize 200 select group_number,name,state ...
- mysql进阶-SQL优化篇
SQL优化 -插入数据 批量插入:(一次尽量不超过1000条) Insert into tb test values(1,'Tom'),(2,'cat'),(3, Jerny'); 手动事务提交: s ...
- SpringBoot用户头像上传
1.上传到本地服务器 controller层主要以MultipartFile接收即可,这里返回给前端的该文件保存后的相对路径 @RequestMapping(value = "/applic ...
- 顺序表(python)
文章目录 1.创建顺序表 2.按址查找元素的位置 3.增加元素 3.1在头部增加元素 3.2在尾部增加元素 3.3在中间任意位置增加元素 4.删除元素 4.1删除第一个元素 4.2删除指定的元素 5. ...
- Webshell流量分析之菜刀Chopper&蚁剑AntSword
目录 中国菜刀 蚁剑 菜刀和蚁剑的一句话木马的流量都有一个特点,都没有加密的,使用wireshark抓包来分析. 中国菜刀 中国菜刀是一款经典的webshell管理工具,具有文件管理.数据库管理.虚拟 ...