No bean named 'springSecurityFilterChain' is defined=
- 格式:docx
- 大小:14.43 KB
- 文档页数:2
SpringSecurity使用记录(五)-- 配置研究了好长时间,不知道从哪里下手。
新的版本,很多东西在网上找不到,只能看他们的文档,当然这些文档相当不错,就看是否耐心的研究了!总是有急躁的心理作祟,不能专心研读,却处处碰壁,效率上反而未达预期效果!终于,在无数次的沮丧下,稍微看到了点光亮!前面的文章太过皮毛,接下来的一些,希望能更加实际的,更加深入的分析每一个过程!一直通过默认配置进行设置:namespace(是security 3.0,网上也看到一些兄弟描述的是3.0,但是总是不符合我这里的namespace配置):<beans:beans xmlns="/schema/security"xmlns:beans="/schema/beans"xmlns:xsi="/2001/XMLSchema-instance"xsi:schemaLocation="/schema/beans /schema/beans/spring-beans-3.0.xsd/schema/security/schema/security/spring-security-3.0.xsd">按照默认配置的http(这是用来根据namespace设置的基本的security过滤器chain):auto-config=true时,就相当于<http><form-login /><http-basic /><logout /></http>也就是使用了默认的过滤器。
我最开始的想法是能够把本地的login信息(不是调用spring security的login方法),传入到spring security的验证过滤器里面。
这里有一个比较关键的问题,就是封装他们的过滤器(或者仅仅是知道他们到底是哪些过滤器在起作用):表1Alia s FilterClassNamespaceElementorAttributeCHA NNE L_FI LTE R ChannelProcessingFilterhttp/intercept-url@requires-channelCON CUR REN ConcurrentSessisession-management/concurrenT_S ESS ION _FIL TER onFiltercy-controlSECURI TY_ CON TEX T_FI LTE R Securi tyContextPersistenceFilterhttpLOGOUT _FIL TER LogoutFilterhttp/logoutX50 9_FI LTE R X509AuthenticationFilterhttp/x509PRE _AU TH_ FILT ER Astrac tPreAuthenticatedProcessingFilterSubc lassesN/ACAS _FIL TER CasAu thenti cationFilterN/AFOR M_L OGI N_F ILTE R UsernamePasswordAuthenticationFilterhttp/form-loginBAS IC_BasicAuthehttp/http-basicAUT H_F ILTE R nticati onFilt erSERVLE T_A PI_ SUP POR T_FI LTE R SecurityContextHolderAwareFilterhttp/@servlet-api-provisionREM EMB ER_ ME_ FILT ER RememberMeAuthenticationFilterhttp/remember-meANO NYM OUS _FIL TER AnonymousAuthenticationFilterhttp/anonymousSESSIO N_M ANA GEM ENT _FIL TER SessionManagementFiltersession-managementEXC EPTION_ TRA NSL ATI ON_ FILT ER ExceptionTranslat ionFilterhttpFILT ER_FilterSecurihttpSEC URI TY_I NTE RCE PTO R tyInte rcept orSWITCH _US ER_ FILT ER SwitchUserFilterN/A(最开始看的时候,把这个表格忽略了,现在看来这些就是我们想要的!)我们的验证过程,就是按照这样的顺序进行的。
SpringNoSuchBeanDefinitionException六⼤原因总结1. OverviewIn this article, we are discussing the Springorg.springframework.beans.factory.NoSuchBeanDefinitionException – this is a common exception thrown by the BeanFactory when trying to resolve a bean that simply isn’t defined in the Spring Context.We will discuss here the possible causes for this problem and the available solutions.2. Cause: No qualifying bean of type [...] found for dependencyThe most common cause of this exception is simply trying to inject a bean that isn’t defined. For example – BeanB is wiring in a collaborator – BeanA:1 2 3 4 5 6 7@Componentpublic class BeanA {@Autowiredprivate BeanB dependency; ...}Now, if the dependency – BeanB – is not defined in the Spring Context, the bootstrap process will fail with the no such bean definition exception:1 2 3 4org.springframework.beans.factory.NoSuchBeanDefinitionException:No qualifying bean of type[org.baeldung.packageB.BeanB] found for dependency:expected at least 1 bean which qualifies as autowire candidate for this dependency.Dependency annotations: {@org.springframework.beans.factory.annotation.Autowired(required=true)}The reason is clearly indicated by Spring: “expected at least 1 bean which qualifies as autowire candidate for this dependency“One reason BeanB may not exist in the context – if beans are picked up automatically byclasspath scanning, and if BeanB is correctly annotated as a bean (@Component,@Repository, @Service, @Controller, etc) – is that it may be defined in a package that is not scanned by Spring:1 2 3package org.baeldung.packageB; @Componentpublic class BeanB { ...}While the classpath scanning may be configured as follows:1 2 3 4 5@Configuration@ComponentScan("org.baeldung.packageA") public class ContextWithJavaConfig {...}If beans are not automatically scanned by instead defined manually, then BeanB is simply not defined in the current Spring Context.3. Cause: No qualifying bean of type [...] is definedAnother cause for the exception is the existence of two bean definitions in the context, instead of one. For example, if an interface – IBeanB is implemented by two beans –BeanB1 and BeanB2:12 3 4 5 6 7 8@Componentpublic class BeanB1 implements IBeanB { //}@Componentpublic class BeanB2 implements IBeanB { //}Now, if BeanA autowires this interface, Spring will not know which one of the two implementations to inject:1 2 3@Component public class BeanA {34 5 6 7 @Autowiredprivate IBeanB dependency; ...}And again, this will result in a NoSuchBeanDefinitionException being thrown by theBeanFactory:1 2 3Caused by: org.springframework.beans.factory.NoUniqueBeanDefinitionException: No qualifying bean of type[org.baeldung.packageB.IBeanB] is defined: expected single matching bean but found 2: beanB1,beanB2Similarly, Spring clearly indicates the reason for the wiring failure: “expected single matching bean but found 2″.Notice however, that in this case, the exact exception being thrown is notNoSuchBeanDefinitionException but a subclass– theNoUniqueBeanDefinitionException. This new exception has been , for exactly this reason – to differentiate between the cause where no bean definition was found and this one – where several definitions are found in the context.Before this change, the exception above was:1 2 3Caused by: org.springframework.beans.factory.NoSuchBeanDefinitionException: No qualifying bean of type[org.baeldung.packageB.IBeanB] is defined: expected single matching bean but found 2: beanB1,beanB2One solution to this problem is to use the @Qualifier annotation to specify exactly the name of the bean we want to wire:1 2 3 4 5 6 7 8@Componentpublic class BeanA {@Autowired@Qualifier("beanB2")private IBeanB dependency; ...}Now Spring has enough information to make the decision of which bean to inject –BeanB1 or BeanB2 (the default nameof BeanB2 is beanB2).4. Cause: No Bean Named [...] is definedA NoSuchBeanDefinitionException may also be thrown when a bean that isn’t defined isrequested by name from the Spring context:1 2 3 4 5 6 7 8 9 10 11@Componentpublic class BeanA implements InitializingBean { @Autowiredprivate ApplicationContext context;@Overridepublic void afterPropertiesSet() {context.getBean("someBeanName");}}In this case, there is no bean definition for “someBeanName” – leading to the following exception:1 2Caused by: org.springframework.beans.factory.NoSuchBeanDefinitionException: No bean named 'someBeanName'is definedAgain, Spring clearly and concisely indicates the reason for the failure: “No bean named X is defined“.5. Cause: Proxied BeansWhen a bean in the context is proxied using the JDK Dynamic Proxy mechanism, then the proxy will not extend the target bean (it will however implement the same interfaces).Because of this, if the bean is injected by an interface, it will be correctly wired in. If however the bean is injected by the actual class, then Spring will not find a bean definition that matches the class – since the proxy does not actually extend the class.A very common reason the bean may be proxied is the Spring transactional support – namely beans that are annotatedwith @Transactional.For example, if ServiceA injects ServiceB, and both services are transactional, injecting by the class definition will not work:1 2 3 4 5 6 7 8 9 10 11 12 13 14@Service@Transactionalpublic class ServiceA implements IServiceA{ @Autowiredprivate ServiceB serviceB;...}@Service@Transactionalpublic class ServiceB implements IServiceB{ ...}The same two services, this time correctly injecting by the interface, will be OK:1 2 3 4 5 6 7 8 9 10 11 12 13 14@Service@Transactionalpublic class ServiceA implements IServiceA{ @Autowiredprivate IServiceB serviceB;...}@Service@Transactionalpublic class ServiceB implements IServiceB{ ...}6. ConclusionThis tutorial discussed examples of the possible causes for the commonNoSuchBeanDefinitionException – with a focus on how to address these exceptions in practice.The implementation of all these exceptions examples can be found in – this is an Eclipse based project, so it should be easy to import and run as it is.。
CXF和spring整合遇到的问题:Nobeannamedcxfisdefined
今天在做ws和spring整合的时候,很不幸的遇到了这个问题,百度了好久,竟然没⼈遇到这个问题,后来⾕歌了⼀下,都是遇到这个问题的了。
在看到⼀篇⽂章中提到了cxf.xml,所以我果断的打开这个配置⽂件看了⼀下,有⼀个很关键的地⽅:
<bean id="cxf"class="org.apache.cxf.bus.spring.SpringBus" destroy-method="shutdown"/>
哦,原来这个bean在这⾥定义的,那应该就是这个⽂件没导⼊到我们的spring⽂件中去了。
后来仔细⼀看,发现⾃⼰的ws的spring配置⽂件没被扫描==!。
好像⾼版本的spring会⾃动加载这⼏个⽂件的。
如果没有加载的话,那么我们就⼿动加载:
<!-- 引cxf的⼀些核⼼配置 -->
<import resource="classpath:META-INF/cxf/cxf.xml" />
<import resource="classpath:META-INF/cxf/cxf-extension-soap.xml" />
<import resource="classpath:META-INF/cxf/cxf-servlet.xml" />
其中,我们遇到问题的那个就是在‘cxf.xml’中。
spring配置xml遇到的问题——nobeannamedxxxavailable跟着慕课⽹的免费课打算加强⾃⼰对于spring的理解,结果第⼀步在spring配置bean的xml就遇到了问题,感觉名字什么的都是对的,但是就是⼀直报no bean named 'xxx' available这个错,也不知道为什么。
这个错误的意思是没有叫xxx这个名字的bean可获得。
根据这个提⽰我思考了⼀下可能的问题。
1.xml这个bean的id的命名和我应⽤时写的要获取的名字不⼀样。
(排除)2.xml这个bean的class路径不对。
(排除)3.实际上这个xml没有获取到。
(是的)最后发现的确是这个xml没有获取到,其实控制台没有显⽰Loading XML bean definitions from URL 就应该能看出来,但是还是忽略了这个信息找了很久的原因。
原因找到了但是为什么没有找到这个xml呢。
我⽤的是classpath*:spring-dao.xml去获取的spring-dao.xml这个⽂件,应该是去bin⽬录下的根⽬录找的,但是bin的根⽬录下不存在这个⽂件,可能是我⽂件的层级设置出了问题,⽂件夹和package的设置出了点问题,导致spring-dao.xml编译到bin的时候不是在根⽬录⽽是在⾥⾯⼏层的⽂件夹⾥。
这个博客解释了⼀下eclipse 下⾯的folder,source folder,package的区别与作⽤,“所以就设计出来⼀个特别的⽂件夹叫source folder,放在他下⾯的java⽂件就能被编译,⽽且,可以通过⼀定的配置将编译⽂件放在你配置的⽂件夹下⾯”,这个说明了从哪⼀层级的编译到bin或者classes⽂件中去。
也就是要将哪⼀层⾥的东西开始编译到⽬录⾥去,就把哪⼀层的⽂件夹设为source folder,我暂时是这么理解的。
记⼀次Nobeannamedorg.springframework.context.ann。
零、先抛结论该异常抛出只是连锁反应的⼀环,是表象结果⽽不是根本原因,追着⽇志向上查spring是否之前就抛出了其他异常。
⽽正是这些更早的异常导致spring不能符合预期的⼯作。
⼀、现象 服务可以正常启动,在调⽤某些服务的时候必抛出如下异常。
google查找若⼲,多数情况下是启动时报错,⽽不是运⾏时,所有未找到契合的先例。
测试等了半天问啥时候可以解决,只能硬着头⽪说,先绕过观察下其他⽤例是否正常,正是其他⽤例暴露出了bug的尾巴。
org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'myBean'defined in .my.BeanContainer: BeanPostProcessor before instantiation of bean failed;nested exception is org.springframework.beans.factory.BeanCreationException:Error creating bean with name 'org.springframework.cache.annotation.ProxyCachingConfiguration':Initialization of bean failed; nested exception is org.springframework.beans.factory.NoSuchBeanDefinitionException:No bean named 'org.springframework.context.annotation.ConfigurationClassPostProcessor.importRegistry' available⼆、bug的尾巴这个狐狸的尾巴正是下⾯这个异常,说明springContext有问题啊,异常说没有refresh,那是不是applicationContext.refresh()抛异常了呢。
web项目从tomcat移植到websphere6.1提示“no bean named..."的错误这几天搞一个小项目,本地环境采用jdk1.6和tomcat,本地运行完全正常,但是发布到websphere 6.1后,奇怪的问题出现了,访问页面一直提示错误:[11/21/11 11:47:52:358 CST] 0000009c E UOW=nullsource=com.ibm.ws.webcontainer.webapp .WebApp org=IBM prod=WebSphere component=Application Serverthread=[WebContainer : 6][ServletError]-[/grade_step.jsp]:org.springframework.beans.factory.NoS uchBeanDefinitionException: No bean named 'sessionFactory' is definedatorg.springframework.beans.factory.sup port.DefaultListableBeanFactory.getBe anDefinition(DefaultListableBeanFactory.java:387)atorg.springframework.beans.factory.sup port.AbstractBeanFactory.getMergedLoc alBeanDefinition(AbstractBeanFactory. java:971)atorg.springframework.beans.factory.sup port.AbstractBeanFactory.doGetBean(Ab stractBeanFactory.java:246).....以为是程序的原因,于是分别在tomcat5.5和tomcat6下面都试着部署了,都是正常的,然后在网上到处搜索了一下,发现也有人遇到过类似的问题,但是解决办法都描述得不清晰,有人说可能是spring配置的通配符问题,于是我也试着把这些配置修改为详细的列表,居然正常了。
spring security学习笔记-----每天进步一点点一、acegi security2.0 普通配置方法1、spring-security配置<?xml version="1.0" encoding="UTF-8"?><beans xmlns="/schema/beans"xmlns:xsi="/2001/XMLSchema-instance"xsi:schemaLocation="/schema/beans/schema/beans/spring-beans-2.0.xsd" ><!-- 设置过滤器链,按顺序过滤 --><bean id="filterChainProxy"class="org.acegisecurity.util.FilterChainProxy"><property name="filterInvocationDefinitionSource"><value>CONVERT_URL_TO_LOWERCASE_BEFORE_COMPARISONPATTERN_TYPE_APACHE_ANT/**=sessionIntegrationFilter,logoutFilter,authenticationFilter,anonym ousProcessingFilter,exceptionFilter,securityInterceptor</value></property></bean><!--认证管理器 --><bean id="authenticationManager"class="org.acegisecurity.providers.ProviderManager"><property name="providers"><list><!-- <ref bean="daoAuthenticationProvider" />--><ref local="anonymousAuthenticationProvider"/></list></property></bean><bean id="loggerListener"class="org.acegisecurity.event.authentication.LoggerListener"/> <!-- 基于DAO验证的AuthenticationProvider --><bean id="daoAuthenticationProvider"class="org.acegisecurity.providers.dao.DaoAuthenticationProvider"><property name="userDetailsService" ref="userDetailsService" /> </bean><bean id="anonymousAuthenticationProvider"class="org.acegisecurity.providers.anonymous.AnonymousAuthenticationP rovider"><property name="key" value="anonymous"/></bean><!-- 测试用service 实际中使用Daoservice替代 --><bean id="userDetailsService"class="com.myhoel.security.HotelUserDetailService"><property name="accountDao"><ref bean="accountDao"/></property></bean><!-- 决策管理器, --><bean id="accessDecisionManager"class="org.acegisecurity.vote.AffirmativeBased"><property name="decisionVoters"><list><bean class="org.acegisecurity.vote.RoleVoter" /></list></property><property name="allowIfAllAbstainDecisions" value="false" /> </bean><!--位于过滤器顶端,第一个起作用的过滤器用途一,在执行其他过滤器之前,率先判断用户的session中是否已经存在一个SecurityContext了。
spring security 11种过滤器介绍1.HttpSessionContextIntegrationFilter位于过滤器顶端,第一个起作用的过滤器。
用途一,在执行其他过滤器之前,率先判断用户的session中是否已经存在一个SecurityContext了。
如果存在,就把SecurityContext拿出来,放到SecurityContextHolder中,供Spring Security的其他部分使用。
如果不存在,就创建一个SecurityContext出来,还是放到SecurityContextHolder中,供Spring Security的其他部分使用。
用途二,在所有过滤器执行完毕后,清空SecurityContextHolder,因为SecurityContextHolder是基于ThreadLocal的,如果在操作完成后清空ThreadLocal,会受到服务器的线程池机制的影响。
--------------------------------------------------------------------------------------------2.LogoutFilter只处理注销请求,默认为/j_spring_security_logout。
用途是在用户发送注销请求时,销毁用户session,清空SecurityContextHolder,然后重定向到注销成功页面。
可以与rememberMe之类的机制结合,在注销的同时清空用户cookie。
--------------------------------------------------------------------------------------------3.AuthenticationProcessingFilter处理form登陆的过滤器,与form登陆有关的所有操作都是在此进行的。
默认情况下只处理/j_spring_security_check请求,这个请求应该是用户使用form登陆后的提交地址,form所需的其他参数可以参考:此过滤器执行的基本操作时,通过用户名和密码判断用户是否有效,如果登录成功就跳转到成功页面(可能是登陆之前访问的受保护页面,也可能是默认的成功页面),如果登录失败,就跳转到失败页面。
SpringSecurity(2):过滤器链(filterchain)的介绍上⼀节中,主要讲了Spring Security认证和授权的核⼼组件及核⼼⽅法。
但是,什么时候调⽤这些⽅法呢?答案就是Filter和AOP。
Spring Security在我们进⾏⽤户认证以及授予权限的时候,通过各种各样的拦截器来控制权限的访问。
对于基于HttpRequest的⽅式对端点进⾏保护,我们使⽤⼀个Filter Chain来保护;对于基于⽅法调⽤进⾏保护,我们使⽤AOP来保护。
本篇重点讲Spring Security中过滤器链的种类及过滤器中如何实现的认证和授权。
Spring Security会默认为我们添加15个过滤器,我们可以从WebSecurity(WebSecurity是Spring Security加载的⼀个重要对象,将在下节具体讲述)的performBuild()⽅法中看到过滤器链SecurityFilterChain的构建过程,并交由FilterChainProxy对象代理。
我们从SecurityFilterChain的默认实现类DefaultSecurityFilterChain中的log看出,Spring Security由以下过滤器组成了过滤器链:Creating filter chain: any request, [org.springframework.security.web.context.request.async.WebAsyncManagerIntegrationFilter@7f353a0f,org.springframework.security.web.context.SecurityContextPersistenceFilter@4735d6e5,org.springframework.security.web.header.HeaderWriterFilter@314a31b0,org.springframework.security.web.csrf.CsrfFilter@4ef2ab73,org.springframework.security.web.authentication.logout.LogoutFilter@57efc6fd,ernamePasswordAuthenticationFilter@d88f893,org.springframework.security.web.authentication.ui.DefaultLoginPageGeneratingFilter@2cd388f5,org.springframework.security.web.authentication.ui.DefaultLogoutPageGeneratingFilter@7ea2412c,org.springframework.security.web.authentication.www.BasicAuthenticationFilter@2091833,org.springframework.security.web.savedrequest.RequestCacheAwareFilter@4dad0eed,org.springframework.security.web.servletapi.SecurityContextHolderAwareRequestFilter@16132f21,org.springframework.security.web.authentication.AnonymousAuthenticationFilter@1c93b51e,org.springframework.security.web.session.SessionManagementFilter@59edb4f5,org.springframework.security.web.access.ExceptionTranslationFilter@104dc1a2,org.springframework.security.web.access.intercept.FilterSecurityInterceptor@1de0641b]下⾯就是各个过滤器的功能,其中SecurityContextPersistenceFilter,UsernamePasswordAuthenticationFilter及FilterSecurityInterceptor分别对应了上节SecurityContext,AuthenticationManager,AccessDecisionManager的处理。
JavaSpringSecurity常见面试题目Java Spring Security常见面试题目1. 什么是Spring Security?Spring Security是一个功能强大且高度可定制的认证和授权框架,用于保护Java应用程序的安全性。
它提供了一套全面的安全性功能,包括身份验证、授权、密码管理、会话管理等,以确保应用程序的数据和资源得到适当的保护。
2. Spring Security的主要特点有哪些?- 身份验证和授权:Spring Security提供了多种身份验证方式,如基于用户名密码的表单验证、基于OpenID的身份验证等,并支持基于角色或权限的访问控制。
- 集成简化:Spring Security能够与Spring框架无缝集成,通过简单的配置即可启用安全性功能。
- 定制化:Spring Security提供了丰富的扩展点和配置选项,可以根据应用程序的需求进行灵活的定制。
- 高度模块化:Spring Security的架构设计具有高度模块化的特点,不同的功能模块可以根据需求进行选用和定制。
- 支持多种应用场景:Spring Security适用于各种应用场景,包括Web应用、RESTful服务、方法级安全等。
3. Spring Security是如何进行身份验证的?Spring Security提供了多种身份验证方式,常见的一种是基于表单的身份验证。
在这种情况下,用户通过输入用户名和密码提交表单进行身份验证,Spring Security会将提交的用户名和密码与事先配置的用户存储库(如数据库)进行比对。
如果用户名和密码匹配,则认为身份验证成功,并生成相应的认证令牌。
4. Spring Security如何进行授权?Spring Security支持基于角色和基于权限的访问控制。
在配置中,可以指定某个URL或某个方法只能被具有特定角色或权限的用户访问。
在运行时,Spring Security会根据当前用户的角色和权限,判断其是否具有访问相应资源的权限。
SpringSecurity面试题集Spring Security面试题集Spring Security是一个功能强大的身份验证和访问控制框架,用于保护Java应用程序的安全性。
在面试中,关于Spring Security的问题经常被问到。
本文将为你提供一些常见的Spring Security面试题,帮助你准备面试并提供详细的回答。
1. 什么是Spring Security?Spring Security是一个基于Spring框架的开放源代码安全性项目。
它提供了一套全面的安全性解决方案,用于构建安全的Java应用程序。
2. Spring Security的核心功能是什么?Spring Security的核心功能包括身份验证(Authentication)和授权(Authorization)。
身份验证用于验证用户的身份,授权用于确定用户是否具有特定资源或操作的访问权限。
3. 请解释Spring Security中的角色和权限的概念。
角色(Role)代表用户在系统中的一组权限集合。
权限(Authority)代表用户对特定资源或操作的具体访问权限。
用户可以拥有一个或多个角色,每个角色可以包含一个或多个权限。
4. Spring Security中的HTTP基本认证是如何工作的?HTTP基本认证通过在HTTP请求的头部中发送Base64编码的用户名和密码来进行身份验证。
服务器收到请求后,会对用户名和密码进行验证,如果验证通过,则允许用户访问受限资源。
5. 什么是CSRF攻击?Spring Security如何防止CSRF攻击?CSRF(Cross-Site Request Forgery)攻击是指攻击者利用用户的身份在用户不知情的情况下执行非法操作。
Spring Security通过生成和验证CSRF令牌来防止CSRF攻击。
令牌会嵌入到表单中或者作为请求头发送,服务器对令牌进行验证以确保请求的合法性。
6. Spring Security默认使用哪种加密算法来存储密码?Spring Security默认使用bcrypt算法来存储密码。
SpringSecurity常⽤过滤器实例解析Spring Security常见的15个拦截器1 . org.springframework.security.web.context.SecurityContextPersistenceFilter⾸当其冲的⼀个过滤器,作⽤之重要,⾃不必多⾔。
SecurityContextPersistenceFilter主要是使⽤SecurityContextRepository在session中保存或更新⼀个SecurityContext,并将SecurityContext给以后的过滤器使⽤,来为后续filter建⽴所需的上下⽂。
SecurityContext中存储了当前⽤户的认证以及权限信息。
2 . org.springframework.security.web.context.request.async.WebAsyncManagerIntegrationFilter此过滤器⽤于集成SecurityContext到Spring异步执⾏机制中的WebAsyncManager3 . org.springframework.security.web.header.HeaderWriterFilter向请求的Header中添加相应的信息,可在http标签内部使⽤security:headers来控制4 . org.springframework.security.web.csrf.CsrfFiltercsrf⼜称跨域请求伪造,SpringSecurity会对所有post请求验证是否包含系统⽣成的csrf的token信息,如果不包含,则报错。
起到防⽌csrf攻击的效果。
5. org.springframework.security.web.authentication.logout.LogoutFilter匹配 URL为/logout的请求,实现⽤户退出,清除认证信息。
热门框架漏洞题目针对热门框架的漏洞题目,这里为您提供了一些相关的信息:1. Spring框架漏洞:Spring Security OAuth2远程命令执行漏洞Spring WebFlow远程代码执行漏洞Spring Data Rest远程命令执行漏洞Spring Messaging远程命令执行漏洞Spring Data Commons远程命令执行漏洞Spring Framework中的XML外部实体(XXE)注入Spring Security认证绕过Spring Framework目录遍历漏洞Spring AMQP中的远程代码执行Spring Boot框架SPEL表达式注入漏洞Spring Data JPA SQL盲注Spring Security未经授权的访问Spring Expression Language SPEL表达式注入漏洞2. ThinkPHP框架漏洞:在之前的版本中存在SQL注入漏洞,该漏洞是由于程序在处理order by后的参数时,未正确过滤处理数组的key值所造成。
3. Struts2框架漏洞:S2-053:Struts2在使用Freemarker模板引擎的时候,同时允许解析OGNL表达式,导致用户输入的数据本身不会被OGNL解析,但由于被Freemarker解析一次后变成离开一个表达式,被OGNL解析第二次,导致任意命令执行漏洞。
S2-057:网站配置XML时如果没有设置namespace的值,并且上层动作配置中并没有设置或使用通配符namespace时,可能会导致远程代码执行漏洞的发生。
S2-061:对S2-059的沙盒绕过。
以上信息仅供参考,建议查阅安全领域的专业书籍或咨询安全领域专家以获取更准确全面的信息。
securityfilterchain方法详解`SecurityFilterChain` 是Spring Security 中用于配置安全过滤器链的接口。
在Spring Security 中,过滤器链是由一系列的过滤器组成,每个过滤器负责处理特定的安全任务。
`SecurityFilterChain` 允许你定义这些过滤器链的配置,以满足你应用程序的安全需求。
下面是关于`SecurityFilterChain` 方法的详细解释:`SecurityFilterChain` 接口方法签名```javaSecurityFilterChain chain = securityFilterChain(HttpSecurity http) throws Exception;```参数- `HttpSecurity http`: 允许你配置特定于HTTP 请求的安全性。
返回值- `SecurityFilterChain`: 一个表示安全过滤器链的对象。
方法详解1. `chain.antMatchers(...).permitAll()`-通过`antMatchers` 方法,你可以指定哪些请求路径不需要进行身份验证。
- `permitAll()` 允许所有用户访问匹配的路径,即不需要进行身份验证。
2. `chain.authorizeRequests()`-使用`authorizeRequests` 可以配置请求的授权规则。
-例如,`.anyRequest().authenticated()` 表示任何请求都需要经过身份验证。
3. `chain.formLogin()`-通过`formLogin` 方法配置基于表单的身份验证。
-包括登录页面、登录处理URL 等的配置。
4. `chain.logout()`-通过`logout` 方法配置登出。
-包括登出成功后的处理URL 等的配置。
5. `chain.httpBasic()`-配置基本的HTTP 身份验证。
Springsecurity⾃定义过滤器实现Json参数传递并兼容表单参数(实例代码)依赖<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-security</artifactId></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency><dependency><groupId>org.projectlombok</groupId><artifactId>lombok</artifactId><optional>true</optional></dependency><dependency><groupId>org.projectlombok</groupId><artifactId>lombok</artifactId><optional>true</optional></dependency>配置安全适配类基本配置和配置⾃定义过滤器package com.study.auth.config.core;import com.study.auth.config.core.authentication.AccountAuthenticationProvider;import com.study.auth.config.core.authentication.MailAuthenticationProvider;import com.study.auth.config.core.authentication.PhoneAuthenticationProvider;import com.study.auth.config.core.filter.CustomerUsernamePasswordAuthenticationFilter;import com.study.auth.config.core.handler.CustomerAuthenticationFailureHandler;import com.study.auth.config.core.handler.CustomerAuthenticationSuccessHandler;import com.study.auth.config.core.handler.CustomerLogoutSuccessHandler;import com.study.auth.config.core.observer.CustomerUserDetailsService;import lombok.extern.slf4j.Slf4j;import org.springframework.beans.factory.annotation.Autowired;import org.springframework.context.annotation.Bean;import org.springframework.security.authentication.AuthenticationManager;import org.springframework.security.config.annotation.authentication.builders.AuthenticationManagerBuilder;import org.springframework.security.config.annotation.web.builders.HttpSecurity;import org.springframework.security.config.annotation.web.builders.WebSecurity;import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity;import org.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter;import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder;import org.springframework.security.web.authentication.AbstractAuthenticationProcessingFilter;import ernamePasswordAuthenticationFilter;/*** @Package: com.study.auth.config* @Description: <>* @Author: milla* @CreateDate: 2020/09/04 11:27* @UpdateUser: milla* @UpdateDate: 2020/09/04 11:27* @UpdateRemark: <>* @Version: 1.0*/@Slf4j@EnableWebSecuritypublic class WebSecurityConfig extends WebSecurityConfigurerAdapter {@Autowiredprivate AccountAuthenticationProvider provider;@Autowiredprivate MailAuthenticationProvider mailProvider;@Autowiredprivate PhoneAuthenticationProvider phoneProvider;@Autowiredprivate CustomerUserDetailsService userDetailsService;@Autowiredprivate CustomerAuthenticationSuccessHandler successHandler;@Autowiredprivate CustomerAuthenticationFailureHandler failureHandler;@Autowiredprivate CustomerLogoutSuccessHandler logoutSuccessHandler;/*** 配置拦截器保护请求** @param http* @throws Exception*/@Overrideprotected void configure(HttpSecurity http) throws Exception {//配置HTTP基本⾝份验证//使⽤⾃定义过滤器-兼容json和表单登录http.addFilterBefore(customAuthenticationFilter(), UsernamePasswordAuthenticationFilter.class).httpBasic().and().authorizeRequests()//表⽰访问 /setting 这个接⼝,需要具备 admin 这个⾓⾊.antMatchers("/setting").hasRole("admin")//表⽰剩余的其他接⼝,登录之后就能访问.anyRequest().authenticated().and().formLogin()//定义登录页⾯,未登录时,访问⼀个需要登录之后才能访问的接⼝,会⾃动跳转到该页⾯.loginPage("/noToken")//登录处理接⼝-登录时候访问的接⼝地址.loginProcessingUrl("/account/login")//定义登录时,表单中⽤户名的 key,默认为 username.usernameParameter("username")//定义登录时,表单中⽤户密码的 key,默认为 password.passwordParameter("password")// //登录成功的处理器// .successHandler(successHandler)// //登录失败的处理器// .failureHandler(failureHandler)//允许所有⽤户访问.permitAll().and().logout().logoutUrl("/logout")//登出成功的处理.logoutSuccessHandler(logoutSuccessHandler).permitAll();//关闭csrf跨域攻击防御http.csrf().disable();}/*** 配置权限认证服务** @param auth* @throws Exception*/@Overrideprotected void configure(AuthenticationManagerBuilder auth) throws Exception {//权限校验-只要有⼀个认证通过即认为是通过的(有⼀个认证通过就跳出认证循环)-适⽤于多登录⽅式的系统// auth.authenticationProvider(provider);// auth.authenticationProvider(mailProvider);// auth.authenticationProvider(phoneProvider);//直接使⽤userDetailsServiceerDetailsService(userDetailsService).passwordEncoder(new BCryptPasswordEncoder());}/*** 配置Spring Security的Filter链** @param web* @throws Exception*/@Overridepublic void configure(WebSecurity web) throws Exception {//忽略拦截的接⼝web.ignoring().antMatchers("/noToken");}/*** 指定验证manager** @return* @throws Exception*/@Override@Beanpublic AuthenticationManager authenticationManagerBean() throws Exception {return super.authenticationManagerBean();}/*** 注册⾃定义的UsernamePasswordAuthenticationFilter** @return* @throws Exception*/@Beanpublic AbstractAuthenticationProcessingFilter customAuthenticationFilter() throws Exception {AbstractAuthenticationProcessingFilter filter = new CustomerUsernamePasswordAuthenticationFilter();filter.setAuthenticationSuccessHandler(successHandler);filter.setAuthenticationFailureHandler(failureHandler);//过滤器拦截的url要和登录的url⼀致,否则不⽣效filter.setFilterProcessesUrl("/account/login");//这句很关键,重⽤WebSecurityConfigurerAdapter配置的AuthenticationManager,不然要⾃⼰组装AuthenticationManagerfilter.setAuthenticationManager(authenticationManagerBean());return filter;}}⾃定义过滤器根据ContentType是否为json进⾏判断,如果是就从body中读取参数,进⾏解析,并⽣成权限实体,进⾏权限认证否则直接使⽤UsernamePasswordAuthenticationFilter中的⽅法package com.study.auth.config.core.filter;import com.fasterxml.jackson.databind.ObjectMapper;import com.study.auth.config.core.util.AuthenticationStoreUtil;import com.study.auth.entity.bo.LoginBO;import lombok.extern.slf4j.Slf4j;import org.springframework.http.MediaType;import ernamePasswordAuthenticationToken;import org.springframework.security.core.Authentication;import org.springframework.security.core.AuthenticationException;import ernamePasswordAuthenticationFilter;import javax.servlet.http.HttpServletRequest;import javax.servlet.http.HttpServletResponse;import java.io.IOException;import java.io.InputStream;/*** @Package: com.study.auth.config.core.filter* @Description: <>* @Author: milla* @CreateDate: 2020/09/11 16:04* @UpdateUser: milla* @UpdateDate: 2020/09/11 16:04* @UpdateRemark: <>* @Version: 1.0*/@Slf4jpublic class CustomerUsernamePasswordAuthenticationFilter extends UsernamePasswordAuthenticationFilter {/*** 空字符串*/private final String EMPTY = "";@Overridepublic Authentication attemptAuthentication(HttpServletRequest request, HttpServletResponse response) throws AuthenticationException {//如果不是json使⽤⾃带的过滤器获取参数if (!request.getContentType().equals(MediaType.APPLICATION_JSON_UTF8_VALUE) && !request.getContentType().equals(MediaType.APPLICATION_JSON_VALUE)) { String username = this.obtainUsername(request);String password = this.obtainPassword(request);storeAuthentication(username, password);Authentication authentication = super.attemptAuthentication(request, response);return authentication;}//如果是json请求使⽤取参数逻辑ObjectMapper mapper = new ObjectMapper();UsernamePasswordAuthenticationToken authRequest = null;try (InputStream is = request.getInputStream()) {LoginBO account = mapper.readValue(is, LoginBO.class);storeAuthentication(account.getUsername(), account.getPassword());authRequest = new UsernamePasswordAuthenticationToken(account.getUsername(), account.getPassword());} catch (IOException e) {log.error("验证失败:{}", e);authRequest = new UsernamePasswordAuthenticationToken(EMPTY, EMPTY);} finally {setDetails(request, authRequest);Authentication authenticate = this.getAuthenticationManager().authenticate(authRequest);return authenticate;}}/*** 保存⽤户名和密码** @param username 帐号/邮箱/⼿机号* @param password 密码/验证码*/private void storeAuthentication(String username, String password) {AuthenticationStoreUtil.setUsername(username);AuthenticationStoreUtil.setPassword(password);}}其中会有body中的传参问题,所以使⽤ThreadLocal传递参数PS:枚举类具备线程安全性package com.study.auth.config.core.util;/*** @Package: com.study.auth.config.core.util* @Description: <使⽤枚举可以保证线程安全>* @Author: milla* @CreateDate: 2020/09/11 17:48* @UpdateUser: milla* @UpdateDate: 2020/09/11 17:48* @UpdateRemark: <>* @Version: 1.0*/public enum AuthenticationStoreUtil {AUTHENTICATION;/*** 登录认证之后的token*/private final ThreadLocal<String> tokenStore = new ThreadLocal<>();/*** 需要验证⽤户名*/private final ThreadLocal<String> usernameStore = new ThreadLocal<>();/*** 需要验证的密码*/private final ThreadLocal<String> passwordStore = new ThreadLocal<>();public static String getUsername() {return ernameStore.get();}public static void setUsername(String username) {ernameStore.set(username);}public static String getPassword() {return AUTHENTICATION.passwordStore.get();}public static void setPassword(String password) {AUTHENTICATION.passwordStore.set(password);}public static String getToken() {return AUTHENTICATION.tokenStore.get();}public static void setToken(String token) {AUTHENTICATION.tokenStore.set(token);}public static void clear() {AUTHENTICATION.tokenStore.remove();AUTHENTICATION.passwordStore.remove();ernameStore.remove();}}实现UserDetailsService接⼝package com.study.auth.config.core.observer;import lombok.extern.slf4j.Slf4j;import org.springframework.beans.factory.annotation.Autowired;import er;import erDetails;import erDetailsService;import ernameNotFoundException;import org.springframework.security.crypto.password.PasswordEncoder;import ponent;/*** @Package: com.study.auth.config.core* @Description: <⾃定义⽤户处理类>* @Author: milla* @CreateDate: 2020/09/04 13:53* @UpdateUser: milla* @UpdateDate: 2020/09/04 13:53* @UpdateRemark: <>* @Version: 1.0*/@Slf4j@Componentpublic class CustomerUserDetailsService implements UserDetailsService {@Autowiredprivate PasswordEncoder passwordEncoder;@Overridepublic UserDetails loadUserByUsername(String username) throws UsernameNotFoundException {//测试直接使⽤固定账户代替return User.withUsername("admin").password(passwordEncoder.encode("admin")).roles("admin", "user").build();}}登录成功类package com.study.auth.config.core.handler;import org.springframework.security.core.Authentication;import org.springframework.security.web.authentication.AuthenticationSuccessHandler;import ponent;import javax.servlet.ServletException;import javax.servlet.http.HttpServletRequest;import javax.servlet.http.HttpServletResponse;import java.io.IOException;/*** @Package: com.study.auth.config.core.handler* @Description: <登录成功处理类>* @Author: milla* @CreateDate: 2020/09/08 17:39* @UpdateUser: milla* @UpdateDate: 2020/09/08 17:39* @UpdateRemark: <>* @Version: 1.0*/@Componentpublic class CustomerAuthenticationSuccessHandler implements AuthenticationSuccessHandler {@Overridepublic void onAuthenticationSuccess(HttpServletRequest request, HttpServletResponse response, Authentication authentication) throws IOException, ServletException { HttpServletResponseUtil.loginSuccess(response);}}登录失败package com.study.auth.config.core.handler;import org.springframework.security.core.AuthenticationException;import org.springframework.security.web.authentication.AuthenticationFailureHandler;import ponent;import javax.servlet.ServletException;import javax.servlet.http.HttpServletRequest;import javax.servlet.http.HttpServletResponse;import java.io.IOException;/*** @Package: com.study.auth.config.core.handler* @Description: <登录失败操作类>* @Author: milla* @CreateDate: 2020/09/08 17:42* @UpdateUser: milla* @UpdateDate: 2020/09/08 17:42* @UpdateRemark: <>* @Version: 1.0*/@Componentpublic class CustomerAuthenticationFailureHandler implements AuthenticationFailureHandler {@Overridepublic void onAuthenticationFailure(HttpServletRequest request, HttpServletResponse response, AuthenticationException exception) throws IOException, ServletException { HttpServletResponseUtil.loginFailure(response, exception);}}登出成功类package com.study.auth.config.core.handler;import org.springframework.security.core.Authentication;import org.springframework.security.web.authentication.logout.LogoutSuccessHandler;import ponent;import javax.servlet.ServletException;import javax.servlet.http.HttpServletRequest;import javax.servlet.http.HttpServletResponse;import java.io.IOException;/*** @Package: com.study.auth.config.core.handler* @Description: <登出成功>* @Author: milla* @CreateDate: 2020/09/08 17:44* @UpdateUser: milla* @UpdateDate: 2020/09/08 17:44* @UpdateRemark: <>* @Version: 1.0*/@Componentpublic class CustomerLogoutSuccessHandler implements LogoutSuccessHandler {@Overridepublic void onLogoutSuccess(HttpServletRequest request, HttpServletResponse response, Authentication authentication) throws IOException, ServletException {HttpServletResponseUtil.logoutSuccess(response);}}返回值⼯具类package com.study.auth.config.core.handler;import com.alibaba.fastjson.JSON;import m.ResponseData;import monConstant;import org.springframework.http.MediaType;import org.springframework.security.core.AuthenticationException;import javax.servlet.http.HttpServletResponse;import java.io.IOException;import java.io.PrintWriter;/*** @Package: com.study.auth.config.core.handler* @Description: <>* @Author: milla* @CreateDate: 2020/09/08 17:45* @UpdateUser: milla* @UpdateDate: 2020/09/08 17:45* @UpdateRemark: <>* @Version: 1.0*/public final class HttpServletResponseUtil {public static void loginSuccess(HttpServletResponse resp) throws IOException {ResponseData success = ResponseData.success();success.setMsg("login success");response(resp, success);}public static void logoutSuccess(HttpServletResponse resp) throws IOException {ResponseData success = ResponseData.success();success.setMsg("logout success");response(resp, success);}public static void loginFailure(HttpServletResponse resp, AuthenticationException exception) throws IOException {ResponseData failure = ResponseData.error(CommonConstant.EX_RUN_TIME_EXCEPTION, exception.getMessage());response(resp, failure);}private static void response(HttpServletResponse resp, ResponseData data) throws IOException {//直接输出的时候还是需要使⽤UTF-8字符集resp.setContentType(MediaType.APPLICATION_JSON_UTF8_VALUE);PrintWriter out = resp.getWriter();out.write(JSON.toJSONString(data));out.flush();}}其他对象见⾄此,就可以传递Json参数了到此这篇关于Spring security ⾃定义过滤器实现Json参数传递并兼容表单参数的⽂章就介绍到这了,更多相关Spring security ⾃定义过滤器内容请搜索以前的⽂章或继续浏览下⾯的相关⽂章希望⼤家以后多多⽀持!。
spring框架常见的10个问题⼀、找不到配置⽂件的异常org.springframework.beans.factory.BeanDefinitionStoreException: IOException parsing XML document from class path resource[com/herman/ss/controller]; nested exception is java.io.FileNotFoundException: class path resource [com/herman/ss/controller] cannot be opened because it does not exist解释:这个的意思是说,没有找配置⽂件为controller的xml,修改⼀下配置⽂件名字即可。
<init-param><param-name>contextConfigLocation</param-name><param-value>classpath:com/herman/ss/config/testAjax.xml</param-value></init-param>⼆、在xml中配置的命名空间找不到对应的Schema的异常nested exception is org.xml.sax.SAXParseException: cvc-complex-type.2.4.c: The matching wildcard is strict, but no declaration can be found for element'util:list'.xmlns:util="/schema/util" 去掉,因为schema中不存在util命名三、找不到jackson.jar的异常StandardWrapper.Throwableng.NoClassDefFoundError: org/codehaus/jackson/JsonProcessingException缺少jackson的jar包,导⼊jackson-all-1.9.5.jar即可四、bean不是唯⼀的异常org.springframework.beans.factory.NoUniqueBeanDefinitionException: No qualifying bean of type [com.herman.ss.pojo.Person] is defined: expected single matching bean but found 7: person0,person1,person2,person3,person4,person5,person6 atorg.springframework.beans.factory.support.DefaultListableBeanFactory.getBean(DefaultListableBeanFactory.java:313) atorg.springframework.context.support.AbstractApplicationContext.getBean(AbstractApplicationContext.java:985) atcom.herman.ss.test.Test0.test1(Test0.java:35) at com.herman.ss.test.Test0.main(Test0.java:111)这个异常是说,⼀个类配置了多个bean之后,我们还在使⽤ctx.getBean(Person.class);⽅法,即根据bean的类映射去获取bean对象。
spring注解@Component、@Service等⾃动⽣成bean的命名规则参考链接:信息来源今天碰到⼀个问题,写了⼀个@Service的bean,类名⼤致为:CUserxml配置:<context:component-scan base-package="com.xxx.xx.x"/>结果启动报错:No bean named 'cUser' is defined,即找不到名为cUser的beanbean的名字不是我预期的"cUser",临时将bean的名字硬性指定成了cUser来解决的,即:@Service("cUser")在⽹上找了半天,看到有位兄弟说得很有道理,引⽤⼀下(以下内容引⽤⾃篇⾸链接):但还是觉得⽐较奇怪,之前⼀直以为Spring对注解形式的bean的名字的默认处理就是将⾸字母⼩写,再拼接后⾯的字符,但今天看来不是这样的。
回来翻了⼀下原码,原来还有另外的⼀个特殊处理:当类的名字是以两个或以上的⼤写字母开头的话,bean的名字会与类名保持⼀致/** * Derive a default bean name from the given bean definition.* <p>The default implementation simply builds a decapitalized version* of the short class name: e.g. "mypackage.MyJdbcDao" -> "myJdbcDao".* <p>Note that inner classes will thus have names of the form* "outerClassName.InnerClassName", which because of the period in the* name may be an issue if you are autowiring by name.* @param definition the bean definition to build a bean name for* @return the default bean name (never {@code null})*/protected String buildDefaultBeanName(BeanDefinition definition) {String shortClassName = ClassUtils.getShortName(definition.getBeanClassName());return Introspector.decapitalize(shortClassName);}/** * Utility method to take a string and convert it to normal Java variable* name capitalization. This normally means converting the first* character from upper case to lower case, but in the (unusual) special* case when there is more than one character and both the first and* second characters are upper case, we leave it alone.* <p>* Thus "FooBah" becomes "fooBah" and "X" becomes "x", but "URL" stays* as "URL".** @param name The string to be decapitalized.* @return The decapitalized version of the string.*/public static String decapitalize(String name) {if (name == null || name.length() == 0) {return name;} // 如果发现类的前两个字符都是⼤写,则直接返回类名if (name.length() > 1 && Character.isUpperCase(name.charAt(1)) &&Character.isUpperCase(name.charAt(0))){return name;} // 将类名的第⼀个字母转成⼩写,然后返回 char chars[] = name.toCharArray();chars[0] = Character.toLowerCase(chars[0]); return new String(chars);}。
解决SpringSecurity⼀直登录失败的问题springsecurity 是spring提供的关于登录授权的框架,他提供了controller层的服务,只需要我们⾃⼰实现service层和dao层,以及⼀些相关的配置错误结果以及调试信息
笔者初次使⽤springsecurity,登录⼀直显⽰错误,郁闷的⼀批,代码debug调试结构
调试结果显⽰service层返回controller层的结果⾥⾯全部正确,最后⼀个List 参数也符合权限配置
结果仍旧返回失败,经过两个⼩时的各种跪求,找到了原因。
解决⽅案
原来,springsecurity 安全认证的⽅式是,将前端⽤户输⼊的密码经⾏加密,加密⽅法在如下配置
前端加密过后的密码会和数据库密码进⾏对⽐,由于数据库是我⼿动插⼊的没有进⾏加密,所以导致,框架密码验证不⼀样,导致登录失败;修改。
将密码加密后插⼊数据库。
或者,把配置中加密⽅式注释掉,service层 user 的第⼆个密码参数这样设置
这⾥的user 继承了userdetails 是springsecurity⾥的类。
Spring Security⽆法跳转页⾯,⼀直在login.html页⾯
解决Spring Security⽆法跳转页⾯,⼀直在login.html页⾯的⽅法
在Spring Security中删除配置login-processing-url="/login.html"即可
以上为个⼈经验,希望能给⼤家⼀个参考,也希望⼤家多多⽀持。
bean的命名规则Bean是Java中一种特定的对象,是由Spring IoC容器管理的对象。
由于在Java中大多数对象都可以被称为bean,因此在Spring应用中,为了能够清晰理解每个bean所承担的功能,需要对bean进行命名。
下面是bean的命名规则中文介绍。
命名规则的基本原则:1.唯一性:每个bean的名称必须唯一。
2.简单性:bean的名称应该简单明了。
4.一致性:在整个Spring应用中,应该遵循相同的bean命名规则。
5.规范性:关键字和符号应该遵循规定的命名规则。
1. 以类名命名在这种情况下,bean的名称与类名相同。
例如,一个Person类的bean的名称可以为person。
2. 驼峰式命名4. 自定义命名在这种情况下,可以指定一些自定义的命名规则,根据项目需求进行适当的命名。
例如,根据模块的名称,可以使用模块名称前缀和类名称后缀来定义bean的名称。
例如,一个用户服务类在用户模块中可以被称为userModuleUserService。
在为bean命名时需要注意以下几点:1.避免特殊字符和关键字:在命名bean时,不要使用特殊字符或关键字作为bean名称。
2.避免名称重复:bean的名称必须是唯一的,不应该与其他bean名称重复。
3.简洁明了:bean的名称应该简单明了,能够清晰明了地描述bean所代表的含义。
总结:对bean进行命名的规则和要求是非常重要的,它们直接关系到整个Spring应用中的完整性和可维护性。
正确的bean命名规则可以使应用的代码更加清晰和易于理解,从而有助于代码的维护和后期的开发。
在开发项目时,应根据项目的特点和命名规范来命名bean。
No bean named 'springSecurityFilterChain' is defined Exception starting filter springSecurityFilterChain
org.springframework.beans.factory.NoSuchBeanDefinitionExceptio n: No bean named 'springSecurityFilterChain' is defined
at
org.springframework.beans.factory.support.DefaultListableBeanFa ctory.getBeanDefinition(DefaultListableBeanFactory.java:387)
at
org.springframework.beans.factory.support.AbstractBeanFactory.g etMergedLocalBeanDefinition(AbstractBeanFactory.java:971)
at
org.springframework.beans.factory.support.AbstractBeanFactory.d oGetBean(AbstractBeanFactory.java:246)
at
org.springframework.beans.factory.support.AbstractBeanFactory.g etBean(AbstractBeanFactory.java:185)
at
org.springframework.beans.factory.support.AbstractBeanFactory.g etBean(AbstractBeanFactory.java:168)
at
org.springframework.context.support.AbstractApplicationContext.g etBean(AbstractApplicationContext.java:884)
at
org.springframework.web.filter.DelegatingFilterProxy.initDelegate( DelegatingFilterProxy.java:216)
at
org.springframework.web.filter.DelegatingFilterProxy.initFilterBean (DelegatingFilterProxy.java:145)
at
org.springframework.web.filter.GenericFilterBean.init(GenericFilter Bean.java:179)
解决方案:
第一、有没有包冲突,一般将系统的删去,用spring security不会有问题。
第二、确保在spring的xml里面有<http>声明默认初始化。
第三、确保能够找到spring 的xml文件。
第四、不要把springSecurityFilterChain写成"SpringSecurityFilterChain”,头一个字母不要是大写。
我想其
中的原因应该是springSecurityFilterChain是默认的,所以要在命名上也要一致,要不然找不到这个bean。