广告
返回顶部
首页 > 资讯 > 后端开发 > Python >SpringBootShiroauto-configure工作流程详解
  • 529
分享到

SpringBootShiroauto-configure工作流程详解

SpringBootShiroauto-configureSpringBootShiro工作流程 2023-02-10 12:02:26 529人浏览 安东尼

Python 官方文档:入门教程 => 点击学习

摘要

目录01-shiro 自动配置原理02-自动配置类03-Filter 相关的配置类04-总结01-Shiro 自动配置原理 Shiro 与 Spring Boot 集成可以通过 sh

01-Shiro 自动配置原理

Shiro 与 Spring Boot 集成可以通过 shiro-spring-boot-stater 实现,并能完成必要类自动装配。 实现方式是通过 Spring Boot 的自动配置机制,即 WEB-INF/spring.factories 中通过 EnableAutoConfiguration 指定了 6 个自动化配置类:

org.springframework.boot.autoconfigure.EnableAutoConfiguration = \
  org.apache.shiro.spring.config.web.autoconfigure.ShiroWebAutoConfiguration,\
  org.apache.shiro.spring.config.web.autoconfigure.ShiroWebFilterConfiguration,\
  org.apache.shiro.spring.config.web.autoconfigure.ShiroWebmvcAutoConfiguration,\
  org.apache.shiro.spring.boot.autoconfigure.ShiroBeanAutoConfiguration,\
  org.apache.shiro.spring.boot.autoconfigure.ShiroAutoConfiguration,\
  org.apache.shiro.spring.boot.autoconfigure.ShiroAnnotationProcessorAutoConfiguration

它们之间的关系为:

当配置项 shiro.enabled = trueshiro.web.enabled = false 时,ShiroWeb*Configuration 配置不生效。 当 shiro.web.enabled = true 时,上述六个皆生效,不过 ShiroWebAutoConfiguration 上有注解 @AutoConfigureBefore(ShiroAutoConfiguration.class), 保证能在 ShiroAutoConfiguration 之前,使用 web 配置覆盖 standalone 配置

02-自动配置类

Shiro 中的核心是 SecurityManager,它将 Authenticator、Authorizer、SessionManager 等关键模块组合在一起。 在 ShiroWebAutoConfiguration 中包含了上述几个核心模块的默认初始化过程。

对 Authenticator 来说(ShiroWebAutoConfiguration 返回的都是父类方法的内容,所以下面我直接将方法体替换为父类的):

@Bean
@ConditionalOnMissingBean
@Override
protected AuthenticationStrategy authenticationStrategy() {
    return new AtLeastOneSuccessfulStrategy();
}
@Bean
@ConditionalOnMissingBean
@Override
protected Authenticator authenticator() {
    ModularRealmAuthenticator authenticator = new ModularRealmAuthenticator();
    authenticator.setAuthenticationStrategy(authenticationStrategy());
    return authenticator;
}

默认情况下,使用的是 ModularRealmAuthenticator,策略类使用的事 AtLeastOneSuccessfulStrategy,即多个 Realms 时,至少一个成功则认为是成功。

对 Authorizer 来说:

@Bean
@ConditionalOnMissingBean
@Override
protected Authorizer authorizer() {
    ModularRealmAuthorizer authorizer = new ModularRealmAuthorizer();
    if (permissionResolver != null) {
        // 负责从 permission 字符串里解析出 Permission 对象
        authorizer.setPermissionResolver(permissionResolver);  // 这两个都是通过 @Autowired 注入进来的
    }
    if (rolePermissionResolver != null) {
        // 负责从 role 字符串里解析出 Permission 集合
        authorizer.setRolePermissionResolver(rolePermissionResolver);  // 这两个都是通过 @Autowired 注入进来的
    }
    return authorizer;
}

对于 SessionManager 来说:

@Bean
@ConditionalOnMissingBean
@Override
protected SessionManager sessionManager() {
    if (useNativeSessionManager) {  // 从环境变量 shiro.userNativeSessionManager 取,默认为 false
        // 省略了其他设置
        return new DefaultWebSessionManager();
    }
    return new ServletContainerSessionManager();
}

对于 SecurityManager 来说:

@Bean
@ConditionalOnMissingBean
@Override
protected SessionsSecurityManager securityManager(List<Realm> realms) {
    DefaultWebSecurityManager securityManager = new DefaultWebSecurityManager();
    securityManager.setSubjectDAO(subjectDAO());
    securityManager.setSubjectFactory(subjectFactory());
    securityManager.setRememberMeManager(rememberMeManager());
    securityManager.setAuthenticator(authenticator());
    securityManager.setAuthorizer(authorizer());
    securityManager.setRealms(realms);
    securityManager.setSessionManager(sessionManager());
    securityManager.setEventBus(eventBus);
    if (cacheManager != null) {
    securityManager.setCacheManager(cacheManager);
    }
    return securityManager;
}

对于其他对象,例如 SubjectDAO/SubjectFactory、SessionDAO/SessionFactory/SessionManager、RememberMeManager、EventBus,在系统中属于比较底层的辅助模块,一般与业务牵扯比较小,所以通过情况下不需要修改。 我简单介绍下它们的作用,以及 Shiro Web 应用中使用得默认类型:

  • SubjectFactory 有两个默认实现,DefaultSubjectFactory 和 DefaultWebSubjectFactory 分别用来创建 standalone 和 Web 程序中的 Subject 对象。
  • SubjectDAO 有一个默认实现,DefaultSubjectDAO 负责将 Subject 对象存储到其所属的 Session 对象中。
  • RememberMeManager 负责将 Subject 的 principals 存储到 cookie 中。
  • EventBus 是 Shiro 中的事件总线,负责在 Shiro 全声明周期触发特定事件或接受事件通知。
  • SessionDAO/SessionFactory/SessionManager 是与 Session 管理、持久化相关的模块。

03-Filter 相关的配置类

ShiroWebFilterConfiguration 中定义了与 Servlet Filter 相关的对象。 对于 ShiroFilterFactoryBean,负责创建 shiroFilter 对象:

@Bean
@ConditionalOnMissingBean
@Override
protected ShiroFilterFactoryBean shiroFilterFactoryBean() {
    ShiroFilterFactoryBean filterFactoryBean = new ShiroFilterFactoryBean();
    // 从环境变量中取
    filterFactoryBean.setLoginUrl(loginUrl);   // shiro.loginUrl
    filterFactoryBean.setSuccessUrl(successUrl); // shiro.successUrl
    filterFactoryBean.setUnauthorizedUrl(unauthorizedUrl); // shiro.unauthorizedUrl
    filterFactoryBean.setSecurityManager(securityManager);  // 由 @Autowired 注入
    filterFactoryBean.setShiroFilterConfiguration(shiroFilterConfiguration()); // 由 @Autowired 注入或默认使用 ShiroFilterConfiguration
    filterFactoryBean.setGlobalFilters(globalFilters()); // 由 @Autowired 注入
    filterFactoryBean.setFilterChainDefinitionMap(shiroFilterChainDefinition.getFilterChainMap()); // 由 @Autowired 注入
    filterFactoryBean.setFilters(filterMap); // 由 @Autowired 注入
    return filterFactoryBean;
}

对于 filterShiroFilterReGIStrationBean 来说,负责向 ServletContext 中注册 shiroFilter 对象:

@Bean(name = REGISTRATION_BEAN_NAME)
@ConditionalOnMissingBean(name = REGISTRATION_BEAN_NAME)
protected FilterRegistrationBean<AbstractShiroFilter> filterShiroFilterRegistrationBean() throws Exception {
    FilterRegistrationBean<AbstractShiroFilter> filterRegistrationBean = new FilterRegistrationBean<>();
    filterRegistrationBean.setDispatcherTypes(DispatcherType.REQUEST, DispatcherType.FORWARD, DispatcherType.INCLUDE, DispatcherType.ERROR);
    filterRegistrationBean.setFilter((AbstractShiroFilter) shiroFilterFactoryBean().getObject());  // 有前面的 FactoryBean 创建
    filterRegistrationBean.setName(FILTER_NAME);  // shiroFilter
    filterRegistrationBean.setOrder(1);
    return filterRegistrationBean;
}

关于 globalFilters,默认只有 InvalidRequestFilter:

@Bean(name = "globalFilters")
@ConditionalOnMissingBean
protected List<String> globalFilters() {
    return Collections.singletonList(DefaultFilter.invalidRequest.name());
}

通过前面的分析,如果业务需要针对不同的 URL 使用不同的 shiro-filter chain,可以通过自定义 shiroFilterChainDefinition 并将其注入都容器中即可,例如:

@Bean
public ShiroFilterChainDefinition shiroFilterChainDefinition() {
    DefaultShiroFilterChainDefinition chainDefinition = new DefaultShiroFilterChainDefinition();
    chainDefinition.addPathDefinition("/manage/index", "user");
    chainDefinition.addPathDefinition("/manage/loGout", "logout");
    chainDefinition.addPathDefinition("/manage/**", "authc");
    // shiro 放行 swagger
    chainDefinition.addPathDefinition("/swagger-ui/**", "user");
    chainDefinition.addPathDefinition("/swagger-resources/**", "user");
    chainDefinition.addPathDefinition( "/v3/api-docs/**","user");
    chainDefinition.addPathDefinition("/**", "anon");
    return chainDefinition;
}

04-总结

今天,我介绍了 shiro-spring-boot-starter 中对 Shiro 进行自动化配置的细节。 通过对这些配置的了解,能够在遇到具体的业务问题时修改特定模块的实现方式,对理解和使用 Shiro 框架是非常必要的事情。 希望今天的内容能对你有所帮助,更多关于Spring Boot Shiro auto-configure的资料请关注编程网其它相关文章!

--结束END--

本文标题: SpringBootShiroauto-configure工作流程详解

本文链接: https://www.lsjlt.com/news/195523.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • SpringBootShiroauto-configure工作流程详解
    目录01-Shiro 自动配置原理02-自动配置类03-Filter 相关的配置类04-总结01-Shiro 自动配置原理 Shiro 与 Spring Boot 集成可以通过 sh...
    99+
    2023-02-10
    Spring Boot Shiro auto-configure Spring Boot Shiro工作流程
  • 详解Redux的工作流程
    目录Redux理解redux是什么什么情况下需要使用redux?redux工作流程图actionreducerstore求和案例——纯react版求和案例&m...
    99+
    2022-11-13
  • SpringMVC工作流程(详-小白版)
    目录 一、SpingMVC的常用组件  二、SpringMVC的工作流程 一、SpingMVC的常用组件 1)DispatcherServlet 是一种前端控制器,由框架提供。 作用:统一处理请求和响应。除此之外还是整个流程控制的中...
    99+
    2023-08-31
    spring java
  • 详述web前端的工作流程
    一、 简介随着计算机和互联网技术的飞速发展,网站已经成为人们学习、购物、生活和娱乐的主要平台之一。而较为顺畅的网站使用体验,则离不开前端设计的考虑。由此可见,web前端的工作流程显得非常重要,一个好的工作流程常常是一个高质量的网站的保障。本...
    99+
    2023-05-14
  • SpringMVC工作流程(超级详细版)
    目录 一:springMVC常用基本组件 二:SpringMVC执行的流程 一:springMVC常用基本组件 DispatcherServlet 是SpringMVC框架了里面的前端控制器 作用:统一处理用户发来的请求并和响应...
    99+
    2023-08-31
    spring java 后端
  • MapReduce工作流程
    MapReduce工作流程图 流程详解(重点) MapTask 待处理的文本通过submit()方法,获取待处理的数据信息,然后根据InputFormat切片方法机制,生成切片方法文件。把切片方法文件和资源配置文件全部提交在资源路径。提...
    99+
    2014-07-24
    MapReduce工作流程
  • SpringMVC工作流程
    SpringMVC工作流程 一、SpringMVC简介SpringMVC是一种基于Spring实现了Web MVC设计模式的请求驱动类型的轻量级Web框架,使用了MVC架构模式的思想,将web层进行职责解耦,并管理应用所需对象的生命周期,...
    99+
    2014-08-02
    java教程 SpringMVC 工作流程
  • 一文讲解Git的工作流程
    Git是一个流行的分布式版本控制系统,它可以帮助团队协作开发代码。在使用Git时,开发人员需要了解工作流程,以便能够更好地协作工作。接下来,本文将讲解Git的工作流程。一、Git的基本概念在深入讨论Git的工作流程之前,我们先了解一些Git...
    99+
    2023-10-22
  • Java Fluent Mybatis 项目工程化与常规操作详解流程篇 上
    目录前言Maven依赖配置文件调整Knife4j配置添加必要实体增/改总结前言 接着上一篇,上篇已经测试通过,成功添加了数据。那么这篇主要是继续上一个项目,将项目进行工程化包装,增加...
    99+
    2022-11-12
  • Java Fluent Mybatis 项目工程化与常规操作详解流程篇 下
    目录前言查询查询写法1查询写法2代码说明新问题删总结前言 接着上一篇:Java Fluent Mybatis 项目工程化与常规操作详解流程篇 上 仓库地址:GitHub仓库 查询 定...
    99+
    2022-11-12
  • React工作流程及ErrorBoundaries实现过程讲解
    目录什么是Error Boundaries步骤1:捕获错误步骤2:构造callback执行callback总结这里简单讲解下React工作流程,后文有用。分为三步: 触发更新 ren...
    99+
    2022-11-13
  • Java工作流系统-父子流程的配置讲解
    父子流程 关键字: 驰骋工作流程快速开发平台 工作流程管理系统 工作流引擎 asp.net工作流引擎 java工作流引擎. 开发者表单  拖拽式表单 工作流系统 适配数据库: oralce,mysql,s...
    99+
    2022-10-18
  • openstack组件工作流程
    OpenStack组件的工作流程大致可以分为以下几个步骤:1. 用户使用OpenStack的命令行工具或Web界面发起请求。2. 请...
    99+
    2023-10-11
    openstack
  • 【Flowable】Flowable工作流教程
    开始 Flowable是什么? Flowable是一个使用Java编写的轻量级业务流程引擎。Flowable流程引擎可用于部署BPMN 2.0流程定义(用于定义流程的行业XML标准), 创建这些流程定...
    99+
    2023-09-05
    java 开发语言 数据库
  • XtraBackup全备工作流程解读与总结
    背景 出于对XtraBackup工作原理好奇,做了下面的日志解读 备份输出日志解读 [root@node1 09:23:35 /root] #time innobackupex --defaults-fil...
    99+
    2022-10-18
  • Flutter异步操作实现流程详解
    目录一、FutureBuilder二、StreamBuilder在Flutter中,借助 FutureBuilder 组件和 StreamBuilder 组件,可以非常方便地完成异步...
    99+
    2022-11-13
  • 云服务器工作流程
    云服务器是一种虚拟化资源,将计算资源分配给不同的用户,并提供按需访问和使用资源的平台。以下是云服务器的一些基本工作流程: 注册和配置:用户在云服务器提供商的网站上注册,填写其用户信息和计算资源的配置信息。这些信息通常会在服务条款中详细说...
    99+
    2023-10-26
    工作流程 服务器
  • 浅谈Springrefresh的工作流程
    目录功能分类具体步骤1. prepareRefresh2. obtainFreshBeanFactory3. prepareBeanFactory4. postProcessBean...
    99+
    2023-05-17
    Spring refresh refresh工作流程
  • 3ds Max 和 Away3D工作流程
    作者:Jens Chr Brynildsen       随着Away3d 4.0的发布,我们准备了一系列关于工作流程的教程。这个教程将会演示如何从3ds Max中导出带骨骼动画的模型,并且在Away3d中加入互动元素。使用方向键,E键,S...
    99+
    2023-01-31
    工作流程 ds Max
  • springboot+camunda实现工作流的流程分析
    1.在camunda modeler工具里面写流程,任务执行指明Java类 2.保存文件放在resources目录下,并建立一个processes.xml的空文件 3.依赖配置 ...
    99+
    2022-11-12
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作