登录请求被FormAuthenticationFilter拦截

FormAuthenticationFilter会执行其父类AdviceFilter的doFilterInternal方法

其代码如下:

boolean continueChain = preHandle(request, response);//判断是否执行后面的操作
if (continueChain) {
  executeChain(request, response, chain);//放行
}
postHandle(request, response);//执行完操作后的操作  

而preHandle调用PathMatchingFilter.preHandle -> isFilterChainContinued,再调用AccessControlFilter.onPreHandle

onPreHandle(request, response, pathConfig){
return isAccessAllowed(request, response, mappedValue)/*判断是否允许通过,如果不允许则执行onAccessDenied*/
|| onAccessDenied(request, response, mappedValue);
}
//AuthenticatingFilter.isAccessAllowed(request, response, mappedValue)的代码如下
protected boolean isAccessAllowed(ServletRequest request, ServletResponse response, Object mappedValue) {
  return super.isAccessAllowed(request, response, mappedValue)/*返回是已经否登录 return subject.isAuthenticated*/
||(!isLoginRequest(request, response) && isPermissive(mappedValue));
/*不是loginUrl请求,并且是permissive的Url请求;PathMatchingFilter的appliedPaths将filterChainDefinitions中的值转为map,permissive就是从这里取得*/ }
//FormAuthenticationFilter.onAccessDenied(request, response)的代码如下
if (isLoginRequest(request, response)) {
  if (isLoginSubmission(request, response)) {//如果是loginUrl并且是post请求,执行登录请求
    return executeLogin(request, response);
  } else {//如果是loginUrl并且是get请求,则运行放行,否则调到get的loginUrl
    return ture;
}
} else {
saveRequestAndRedirectToLogin(request, response);
//如果不是loginUrl,跳转到get的loginUrl
  return false;
}
//当点击post请求的loginUrl后,执行executeLogin,代码如下
AuthenticationToken token = createToken(request, response);//抽象方法,待实现。可通过request,设置AuthenticationToken的username,password
if (token == null) {
  throw new IllegalStateException(msg);
}
try {
  Subject subject = getSubject(request, response);
  subject.login(token);//此时调用realm的doGetAuthenticationInfo,在这里判断登录账号密码是否匹配,成功,则return AuthenticationInfo,失败,则返回异常(同时此处可设置session等)
  return onLoginSuccess(token, subject, request, response);//如果subject.login成功,则执行onLoginSuccess,否则,进入catch
} catch (AuthenticationException e) {   
  return onLoginFailure(token, e, request, response);
}

shiro登陆流程的更多相关文章

  1. spring集成shiro登陆流程(下)

    首先声明入门看的张开涛大神的<跟我学shiro> 示例:https://github.com/zhangkaitao/shiro-example 博客:http://jinnianshil ...

  2. spring集成shiro登陆流程(上)

    上一篇已经分析了shiro的入口filter是SpringShiroFilter, 那么它的doFilter在哪儿呢? 我们看到它的直接父类AbstractShrioFilter继承了OncePerR ...

  3. shiro的SecurityUtis

    接着上一篇来继续分析shiro源码 这篇主要讲解shiro里面的SecurityUtils 首先我们看该类供我们在业务中用的仅有两个get方法,那么这两个get方法获取的subject和sercuri ...

  4. shiro权限管理框架与springmvc整合

    shiro是apache下的一个项目,和spring security类似,用于用户权限的管理‘ 但从易用性和学习成本上考虑,shiro更具优势,同时shiro支持和很多接口集成 用户及权限管理是众多 ...

  5. springmvc 多数据源 SSM java redis shiro ehcache 头像裁剪

    获取下载地址   QQ 313596790  A 调用摄像头拍照,自定义裁剪编辑头像 B 集成代码生成器 [正反双向](单表.主表.明细表.树形表,开发利器)+快速构建表单;  技术:31359679 ...

  6. java springMVC SSM 操作日志 4级别联动 文件管理 头像编辑 shiro redis

    A 调用摄像头拍照,自定义裁剪编辑头像 B 集成代码生成器 [正反双向](单表.主表.明细表.树形表,开发利器)+快速构建表单;  技术:313596790freemaker模版技术 ,0个代码不用写 ...

  7. springmvc SSM shiro redis 后台框架 多数据源 代码生成器

    A集成代码生成器 [正反双向(单表.主表.明细表.树形表,开发利器)+快速构建表单 下载地址    ; freemaker模版技术 ,0个代码不用写,生成完整的一个模块,带页面.建表sql脚本,处理类 ...

  8. springmvc SSM 多数据源 shiro redis 后台框架 整合

    A集成代码生成器 [正反双向(单表.主表.明细表.树形表,开发利器)+快速构建表单 下载地址    ; freemaker模版技术 ,0个代码不用写,生成完整的一个模块,带页面.建表sql脚本,处理类 ...

  9. SpringMVC+Shiro权限管理【转】

    1.权限的简单描述 2.实例表结构及内容及POJO 3.Shiro-pom.xml 4.Shiro-web.xml 5.Shiro-MyShiro-权限认证,登录认证层 6.Shiro-applica ...

随机推荐

  1. cookie、session的联系和区别,多台web服务器如何共享session

    1.Cookie与Session的联系: cookie在客户端保存状态,session在服务器端保存状态.但是由于在服务器端保存状态的时候,在客户端也需要一个标识,所以session也可能要借助coo ...

  2. [svc]linux中的文件描述符(file descriptor)和文件

    linux中的文件描述符(file descriptor)和文件 linux为了实现一切皆文件的设计哲学,不仅将数据抽象成了文件,也将一切操作和资源抽象成了文件,比如说硬件设备,socket,磁盘,进 ...

  3. LC 384. Shuffle an Array

    Shuffle a set of numbers without duplicates. Example: // Init an array with set 1, 2, and 3. int[] n ...

  4. 代码实现:获取一个文本上每个字符出现的次数,将结果写在times.txt上

    package com.loaderman.test; import java.io.BufferedReader; import java.io.BufferedWriter; import jav ...

  5. spring整合mybatis(代理的方式)【我】

    创建项目等同上一篇非代理方式随笔,只说不一样的部分: 项目结构主要是多了下面红框部分: 配置文件: 主要是dao配置文件中多了Mapper代理java类的扫描包路径: applicationConte ...

  6. Maven 默认 SpringMVC-servlet.xml 基本配置

    <?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.sp ...

  7. 阶段3 3.SpringMVC·_04.SpringMVC返回值类型及响应数据类型_5 响应之使用forward和redirect进行页面跳转

    这个方式用的比较少. forward 转发或者重定向 返回forward关键字就表现现在想使用的就是请求转发 redirect

  8. 基于redis的高并发秒杀的JAVA-DEMO实现!

    在Redis的事务中,WATCH命令可用于提供CAS(check-and-set)功能.假设我们通过WATCH命令在事务执行之前监控了多个Keys,倘若在WATCH之后有任何Key的值发生了变化,EX ...

  9. spring boot系列(四)spring boot 配置spring data jpa (保存修改删除方法)

    spring boot 使用jpa在pom.xml在上文中已经介绍过.在这里直接介绍各个类文件如何编写: 代码结构: domain(存放实体类文件): repository(存放数据库操作文件,相当于 ...

  10. MongoDB数据节点基础操作

    1.查看集群中各节点的状态: rs0:PRIMARY> rs.status() 2.查看集群中各节点配置情况: rs0:PRIMARY> rs.conf() 3.主节点降级为从节点: rs ...