Shiro与Spring结合时报Configuration error: No realms have been configured! One or more realms must be……

本文主要是介绍Shiro与Spring结合时报Configuration error: No realms have been configured! One or more realms must be……,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

在这里插入图片描述
最近在跟着网上的教学视频学习Shiro安全框架,使用Shiro可以方便的做验证、授权等,其中在谈到使用多realm做验证,授权时,报了个缺少realm配置的错误。
Configuration error: No realms have been configured! One or more realms must be present to execute an authorization operation.] with root cause

为什么我会特别写出来这个问题呢?

其实这个问题我当时就解决了,更换了写realms属性的地方,但问题是在学习多realm身份验证时这两个地方都可以写realms属性,偏偏在经过了身份验证,再进行授权时却出现No realms have been configured!。
同时,我也看了下其他的博客,相同问题解决的办法就是securityManager里面authenticator的属性要放在realms属性前面,我尝试了在securityManager里面authenticator的属性放在了realms属性后面,身份验证失败,但是并没有报错。我就更加疑惑了……
没学过Shiro框架的人需要对realm概念先有个大致了解:
realm:就目前我的认识来简单描述下,realm就是一个验证器或者叫关卡,你输入username和password,生成一个UsernamePassswordToken,然后这个token给了某个realm,经过它的比对,通过就验证成功,不通过就验证失败。
多realm验证就可以理解成想要完成身份验证,需要通过多个realm的验证,可能每个realm都有自己的验证策略,最终是否验证成功的判断默认的有三种,比如通过全部的realm验证才算真正通过身份验证,或者通过任意一个realm也算是通过身份验证。

我先把主要的代码陈列下,做几个对比分析下:

applicationConetxt.xml配置文件

1.realms属性直接配置在securityManager里面

1).realms属性是在authenticator属性后面,身份验证、授权完全没有问题
 <bean id="securityManager" class="org.apache.shiro.web.mgt.DefaultWebSecurityManager"><property name="cacheManager" ref="cacheManager"/><property name="authenticator" ref="authenticator"/><property name="realms"><list><ref bean="jdbcRealm"></ref><ref bean="secondRealm"></ref></list></property></bean><!--多Realm认证--><bean id="authenticator" class="org.apache.shiro.authc.pam.ModularRealmAuthenticator"><!--认证策略--><property name="authenticationStrategy"><bean class="org.apache.shiro.authc.pam.AllSuccessfulStrategy"></bean></property></bean>
2).realms属性是在authenticator属性前面,经测试,身份验证不通过,但不会报错
 <bean id="securityManager" class="org.apache.shiro.web.mgt.DefaultWebSecurityManager"><property name="cacheManager" ref="cacheManager"/><property name="realms"><list><ref bean="jdbcRealm"></ref><ref bean="secondRealm"></ref></list></property><property name="authenticator" ref="authenticator"/></bean><!--多Realm认证--><bean id="authenticator" class="org.apache.shiro.authc.pam.ModularRealmAuthenticator"><!--认证策略--><property name="authenticationStrategy"><bean class="org.apache.shiro.authc.pam.AllSuccessfulStrategy"></bean></property></bean>

2.realms属性不配置在securityManager里面,而配置在authenticator里面

经过测试,身份验证时没有问题

 <bean id="securityManager" class="org.apache.shiro.web.mgt.DefaultWebSecurityManager"><property name="cacheManager" ref="cacheManager"/><property name="authenticator" ref="authenticator"/></bean><!--多Realm认证--><bean id="authenticator" class="org.apache.shiro.authc.pam.ModularRealmAuthenticator"><property name="realms"><list><ref bean="jdbcRealm"></ref><ref bean="secondRealm"></ref></list></property><!--认证策略--><property name="authenticationStrategy"><bean class="org.apache.shiro.authc.pam.AllSuccessfulStrategy"></bean></property></bean>

但在授权时就出现了报错:java.lang.IllegalStateException: Configuration error: No realms have been configured! One or more realms must be present to execute an authorization operation.

翻看了源代码发现:
报错的类路径为:

org.apache.shiro.authc.pam.ModularRealmAuthenticator#assertRealmsConfigured

在这里插入图片描述
我最大的疑惑来了……在做多realm身份验证时通过了,就证明配置在authenticator的多个realm确实被加载了,否则在身份验证时就应该报错!
既然能加载多realm,授权时为何又报错?

目前还没找到问题所在,先记在这里,害怕之后就忘了……

这篇关于Shiro与Spring结合时报Configuration error: No realms have been configured! One or more realms must be……的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/162808

相关文章

Spring Security 基于表达式的权限控制

前言 spring security 3.0已经可以使用spring el表达式来控制授权,允许在表达式中使用复杂的布尔逻辑来控制访问的权限。 常见的表达式 Spring Security可用表达式对象的基类是SecurityExpressionRoot。 表达式描述hasRole([role])用户拥有制定的角色时返回true (Spring security默认会带有ROLE_前缀),去

浅析Spring Security认证过程

类图 为了方便理解Spring Security认证流程,特意画了如下的类图,包含相关的核心认证类 概述 核心验证器 AuthenticationManager 该对象提供了认证方法的入口,接收一个Authentiaton对象作为参数; public interface AuthenticationManager {Authentication authenticate(Authenti

Spring Security--Architecture Overview

1 核心组件 这一节主要介绍一些在Spring Security中常见且核心的Java类,它们之间的依赖,构建起了整个框架。想要理解整个架构,最起码得对这些类眼熟。 1.1 SecurityContextHolder SecurityContextHolder用于存储安全上下文(security context)的信息。当前操作的用户是谁,该用户是否已经被认证,他拥有哪些角色权限…这些都被保

Spring Security基于数据库验证流程详解

Spring Security 校验流程图 相关解释说明(认真看哦) AbstractAuthenticationProcessingFilter 抽象类 /*** 调用 #requiresAuthentication(HttpServletRequest, HttpServletResponse) 决定是否需要进行验证操作。* 如果需要验证,则会调用 #attemptAuthentica

Spring Security 从入门到进阶系列教程

Spring Security 入门系列 《保护 Web 应用的安全》 《Spring-Security-入门(一):登录与退出》 《Spring-Security-入门(二):基于数据库验证》 《Spring-Security-入门(三):密码加密》 《Spring-Security-入门(四):自定义-Filter》 《Spring-Security-入门(五):在 Sprin

计算机毕业设计 大学志愿填报系统 Java+SpringBoot+Vue 前后端分离 文档报告 代码讲解 安装调试

🍊作者:计算机编程-吉哥 🍊简介:专业从事JavaWeb程序开发,微信小程序开发,定制化项目、 源码、代码讲解、文档撰写、ppt制作。做自己喜欢的事,生活就是快乐的。 🍊心愿:点赞 👍 收藏 ⭐评论 📝 🍅 文末获取源码联系 👇🏻 精彩专栏推荐订阅 👇🏻 不然下次找不到哟~Java毕业设计项目~热门选题推荐《1000套》 目录 1.技术选型 2.开发工具 3.功能

Spring框架5 - 容器的扩展功能 (ApplicationContext)

private static ApplicationContext applicationContext;static {applicationContext = new ClassPathXmlApplicationContext("bean.xml");} BeanFactory的功能扩展类ApplicationContext进行深度的分析。ApplicationConext与 BeanF

SpringBoot项目是如何启动

启动步骤 概念 运行main方法,初始化SpringApplication 从spring.factories读取listener ApplicationContentInitializer运行run方法读取环境变量,配置信息创建SpringApplication上下文预初始化上下文,将启动类作为配置类进行读取调用 refresh 加载 IOC容器,加载所有的自动配置类,创建容器在这个过程

Spring 源码解读:自定义实现Bean定义的注册与解析

引言 在Spring框架中,Bean的注册与解析是整个依赖注入流程的核心步骤。通过Bean定义,Spring容器知道如何创建、配置和管理每个Bean实例。本篇文章将通过实现一个简化版的Bean定义注册与解析机制,帮助你理解Spring框架背后的设计逻辑。我们还将对比Spring中的BeanDefinition和BeanDefinitionRegistry,以全面掌握Bean注册和解析的核心原理。

SpringMVC入参绑定特别注意

1.直接在controller中定义一个变量,但是此种传输方式有一个限制就是参数名和请求中的参数名必须保持一致,否则失效。 @RequestMapping("test2")@ResponseBodypublic DBHackResponse<UserInfoVo> test2(String id , String name){UserInfoVo userInfoVo = new UserInf