- 浏览: 1193888 次
- 性别:
- 来自: 杭州
文章分类
最新评论
-
insistboy:
写的太棒了,受不了
WebLogic11g-创建域(Domain) -
goldyeah:
厉害了 困扰我大半个月的问题解决了 谢谢博主
WebLogic11g-单双向SSL配置(以Springside3为例) -
zy315351965:
404伤不起
开源流程引擎Snaker -
nannan408:
双向的时候谷歌提示“不接受您的登录证书,或者您可能没有提供登录 ...
WebLogic11g-单双向SSL配置(以Springside3为例) -
一颗赛艇:
不成功啊。启动有问题 <Security> < ...
WebLogic11g-单双向SSL配置(以Springside3为例)
在FilterChainProxy初始化的过程中,大概描述了标签解析的一些步骤,但不够详细
http标签的解析过程由类org.springframework.security.config.http.HttpSecurityBeanDefinitionParser解析。
至此,大概http标签的解析已经差不多了,虽然每个Filter的BeanDefinition创建过程还没有一一细说,但基本步骤如下:
1.通过Filter的类路径获取BeanDefinitionBuilder对象,如
BeanDefinitionBuilder filterBuilder = BeanDefinitionBuilder.rootBeanDefinition(filterClassName);
2.解析xml标签属性,再通过BeanDefinitionBuilder的addPropertyValue、addPropertyReference等方法设置Filter对应BeanDefinition的属性值、依赖bean
3.注册BeanDefinition。通过
ParserContext.registerBeanComponent(
new BeanComponentDefinition(BeanDefinition,beanId));
完成bean的注册。还可以通过ParserContext.getRegistry().registerAlias
方法注册bean的别名
实际上,标签解析就是构造BeanDefinition,然后注册到bean factory中。而BeanDefinition就是Spring中定义bean的数据结构。
<http auto-config="true"> <remember-me key="workweb" token-validity-seconds="3600" data-source-ref="dataSource"/> <form-login login-page="/login.jsp"/> <logout logout-success-url="/login.jsp"/> <intercept-url pattern="/*" access="ROLE_USER"/> </http>
http标签的解析过程由类org.springframework.security.config.http.HttpSecurityBeanDefinitionParser解析。
public BeanDefinition parse(Element element, ParserContext pc) { CompositeComponentDefinition compositeDef = new CompositeComponentDefinition(element.getTagName(), pc.extractSource(element)); pc.pushContainingComponent(compositeDef); final Object source = pc.extractSource(element); //portMapperName、matcher主要提供给SSL相关类使用 final String portMapperName = createPortMapper(element, pc); final UrlMatcher matcher = createUrlMatcher(element); //http标签构造器,该构造函数中对intercept-url、create-session子标签 //进行了预处理,并将所有的intercept-url信息放到List中。 HttpConfigurationBuilder httpBldr = new HttpConfigurationBuilder(element, pc, matcher, portMapperName); //处理List中的intercept-url信息(如pattern、filters),并将结果放到 //Map集合filterChainMap中 httpBldr.parseInterceptUrlsForEmptyFilterChains(); //创建过滤器SecurityContextPersistenceFilter httpBldr.createSecurityContextPersistenceFilter(); //创建过滤器SessionManagementFilter httpBldr.createSessionManagementFilters(); //新建一个空的provider集合 ManagedList<BeanReference> authenticationProviders = new ManagedList<BeanReference>(); //通过空的provider集合产生一个ProviderManager的bean定义 BeanReference authenticationManager = createAuthenticationManager(element, pc, authenticationProviders, null); //创建过滤器SecurityContextHolderAwareRequestFilter httpBldr.createServletApiFilter(); //判断intercept-url标签是否有requires-channel属性,如果有,则创建过滤器 //ChannelProcessingFilter httpBldr.createChannelProcessingFilter(); //创建过滤器FilterSecurityInterceptor //这个创建过程比较复杂,分别为: //1.需要判断是否使用表达式use-expressions //2.解析intercept-url中的access等属性 //3.RoleVoter、AffirmativeBased的定义………… httpBldr.createFilterSecurityInterceptor(authenticationManager); //下面是与认证有关的过滤器,HttpConfigurationBuilder, //AuthenticationConfigBuilder将解析的职责进行了分离 AuthenticationConfigBuilder authBldr = new AuthenticationConfigBuilder(element, pc, httpBldr.isAllowSessionCreation(), portMapperName); //创建过滤器AnonymousAuthenticationFilter,并且构造了provider: //AnonymousAuthenticationProvider,供ProviderManager使用 authBldr.createAnonymousFilter(); //判断是否有remember-me标签,如果有,则创建过滤器 //RememberMeAuthenticationFilter,并且构造了provider: //RememberMeAuthenticationProvider供ProviderManager使用 authBldr.createRememberMeFilter(authenticationManager); //判断是否有request-cache标签,如果有,则构造ref指明的bean定义 //如果没有,则构造HttpSessionRequestCache缓存 authBldr.createRequestCache(); //创建过滤器BasicAuthenticationFilter authBldr.createBasicFilter(authenticationManager); //创建LoginUrlAuthenticationEntryPoint,以及创建过滤器 //UsernamePasswordAuthenticationFilter authBldr.createFormLoginFilter(httpBldr.getSessionStrategy(), authenticationManager); //判断是否使用了openid-login,如果有,则构造openId客户端 //org.springframework.security.openid.OpenID4JavaConsumer authBldr.createOpenIDLoginFilter(httpBldr.getSessionStrategy(), authenticationManager); //判断是否使用了x509,如果有,则创建过滤器 //X509AuthenticationFilter authBldr.createX509Filter(authenticationManager); //判断是否配置了logout,如果有,则创建过滤器LogoutFilter authBldr.createLogoutFilter(); //判断是否配置login-page属性,如果没有,则创建过滤器 //DefaultLoginPageGeneratingFilter,生成默认登录页面 authBldr.createLoginPageFilterIfNeeded(); //创建UserDetailsServiceInjectionBeanPostProcessor //动态向x509、openID、rememberme服务注入UserDetailsService //主要使用了spring的BeanPostProcessor接口功能 authBldr.createUserServiceInjector(); //创建过滤器ExceptionTranslationFilter authBldr.createExceptionTranslationFilter(); List<OrderDecorator> unorderedFilterChain = new ArrayList<OrderDecorator>(); //向FilterChain链中添加filters unorderedFilterChain.addAll(httpBldr.getFilters()); unorderedFilterChain.addAll(authBldr.getFilters()); //向ProviderManager中添加provider authenticationProviders.addAll(authBldr.getProviders()); BeanDefinition requestCacheAwareFilter = new RootBeanDefinition(RequestCacheAwareFilter.class); requestCacheAwareFilter.getPropertyValues().addPropertyValue("requestCache", authBldr.getRequestCache()); unorderedFilterChain.add(new OrderDecorator(requestCacheAwareFilter, REQUEST_CACHE_FILTER)); //添加自定义的Filter,也就是custom-filter标签定义的Filter unorderedFilterChain.addAll(buildCustomFilterList(element, pc)); //对FilterChian链中的Filter进行排序,排序规则参见SecurityFilters枚举类 Collections.sort(unorderedFilterChain, new OrderComparator()); checkFilterChainOrder(unorderedFilterChain, pc, source); List<BeanMetadataElement> filterChain = new ManagedList<BeanMetadataElement>(); for (OrderDecorator od : unorderedFilterChain) { filterChain.add(od.bean); } ManagedMap<BeanDefinition, List<BeanMetadataElement>> filterChainMap = httpBldr.getFilterChainMap(); BeanDefinition universalMatch = new RootBeanDefinition(String.class); universalMatch.getConstructorArgumentValues().addGenericArgumentValue(matcher.getUniversalMatchPattern()); filterChainMap.put(universalMatch, filterChain); //构造FilterChainProxy的Bean registerFilterChainProxy(pc, filterChainMap, matcher, source); pc.popAndRegisterContainingComponent(); return null; }
至此,大概http标签的解析已经差不多了,虽然每个Filter的BeanDefinition创建过程还没有一一细说,但基本步骤如下:
1.通过Filter的类路径获取BeanDefinitionBuilder对象,如
BeanDefinitionBuilder filterBuilder = BeanDefinitionBuilder.rootBeanDefinition(filterClassName);
2.解析xml标签属性,再通过BeanDefinitionBuilder的addPropertyValue、addPropertyReference等方法设置Filter对应BeanDefinition的属性值、依赖bean
3.注册BeanDefinition。通过
ParserContext.registerBeanComponent(
new BeanComponentDefinition(BeanDefinition,beanId));
完成bean的注册。还可以通过ParserContext.getRegistry().registerAlias
方法注册bean的别名
实际上,标签解析就是构造BeanDefinition,然后注册到bean factory中。而BeanDefinition就是Spring中定义bean的数据结构。
评论
3 楼
xsd_旧
2015-11-08
2 楼
Cappuccino12
2015-01-12
有用~可是能不能 在解析下http标签里的属性都是什么意思?
1 楼
李永
2014-03-19
发表评论
-
Spring Security3源码分析-电子书下载
2012-07-30 14:34 8551提供电子书下载链接。 -
Spring Security3源码分析-CAS支持
2012-05-13 21:03 25783Spring Security3对CAS的支持主要在这个spr ... -
Spring Security3源码分析-SSL支持
2012-05-10 12:48 11077Sping Security3对于SSL的支持仅仅表现在对需要 ... -
Spring Security3源码分析-认证授权分析
2012-05-09 21:59 6365前面分析了FilterChainProxy执行过程,也对常用的 ... -
Spring Security3源码分析-Filter链排序分析
2012-05-09 14:39 15310通过前面Spring Security提供的各种Filter的 ... -
Spring Security3源码分析-RequestCacheAwareFilter分析
2012-05-09 12:55 4887RequestCacheAwareFilter过滤器对应的类路 ... -
Spring Security3源码分析-ExceptionTranslationFilter分析
2012-05-09 10:03 7805ExceptionTranslationFilter过滤器对应 ... -
Spring Security3源码分析-SessionManagementFilter分析-下
2012-05-08 21:03 6337很多spring security3资料在 ... -
Spring Security3源码分析-SessionManagementFilter分析-上
2012-05-08 17:26 10924SessionManagementFilter过滤 ... -
Spring Security3源码分析-AnonymousAuthenticationFilter分析
2012-05-08 10:32 5198AnonymousAuthenticationFilter ... -
Spring Security3源码分析-BasicAuthenticationFilter分析
2012-05-08 09:24 9607BasicAuthenticationFilter过滤器对应的 ... -
Spring Security3源码分析-FilterSecurityInterceptor分析
2012-05-07 17:31 15291FilterSecurityInterceptor过滤器对应的 ... -
Spring Security3源码分析-SecurityContextHolderAwareRequestFilter分析
2012-05-07 10:34 6821SecurityContextHolderAwareReque ... -
Spring Security3源码分析-RememberMeAuthenticationFilter分析
2012-05-06 22:33 5952RememberMeAuthenticationFilter过 ... -
Spring Security3源码分析-UsernamePasswordAuthenticationFilter分析
2012-05-06 11:54 24862UsernamePasswordAuthenticationF ... -
Spring Security3源码分析-LogoutFilter分析
2012-05-06 10:18 10305LogoutFilter过滤器对应的类路径为 org.spri ... -
Spring Security3源码分析-SecurityContextPersistenceFilter分析
2012-05-06 08:22 8730通过观察Filter的名字,就能大概猜出来这个过滤器的作用,是 ... -
Spring Security3源码分析-FilterChainProxy执行过程分析
2012-05-06 07:48 4245通过FilterChainProxy的初始化、自定义标签的分析 ... -
Spring Security3源码分析-authentication-manager标签解析
2012-05-05 16:13 21685讲解完http标签的解析过程,authentication-m ... -
Spring Security3源码分析-FilterChainProxy初始化
2012-05-04 16:57 20055很久没有更新博客了,最近对Spring Security做了比 ...
相关推荐
spring security oauth2的源码,方便研究,备份一下。
Spring_Security3_源码分析
Spring Security源码分析六:Spring Social 社交登录源码解析 Spring Security源码分析七:Spring Security 记住我 Spring Security源码分析八:Spring Security 退出 Spring Security源码分析九:Spring Security ...
parboiled 是一个纯Java库提供了一种轻量级,易于使用,功能强大和优雅的PEG(解析表达式语法)分析设施。你定义的Java源代码的语法规则,直接,没有必要专门编写和维护,外部语法文件。同时保持蒸提供全面的支持,...
Java 3DMenu 界面源码,有人说用到游戏中不错,其实平时我信编写Java应用程序时候也能用到吧,不一定非要局限于游戏吧,RES、SRC资源都有,都在压缩包内。 Java zip压缩包查看程序源码 1个目标文件 摘要:Java源码...
│ │ │ 275test-3.txt │ │ │ 275test-4.txt │ │ │ 275test.txt │ │ │ answer-1.txt │ │ │ answer-2.txt │ │ │ answer-3.txt │ │ │ answer-4.txt │ │ │ Desktop_.ini │ │ │ 考题_1.doc │ ...
Java 3DMenu 界面源码,有人说用到游戏中不错,其实平时我信编写Java应用程序时候也能用到吧,不一定非要局限于游戏吧,RES、SRC资源都有,都在压缩包内。 Java zip压缩包查看程序源码 1个目标文件 摘要:Java源码...
│ │ │ 275test-3.txt │ │ │ 275test-4.txt │ │ │ 275test.txt │ │ │ answer-1.txt │ │ │ answer-2.txt │ │ │ answer-3.txt │ │ │ answer-4.txt │ │ │ Desktop_.ini │ │ │ 考题_1.doc │ ...
parboiled 是一个纯Java库提供了一种轻量级,易于使用,功能强大和优雅的PEG(解析表达式语法)分析设施。你定义的Java源代码的语法规则,直接,没有必要专门编写和维护,外部语法文件。同时保持蒸提供全面的支持,...
parboiled 是一个纯Java库提供了一种轻量级,易于使用,功能强大和优雅的PEG(解析表达式语法)分析设施。你定义的Java源代码的语法规则,直接,没有必要专门编写和维护,外部语法文件。同时保持蒸提供全面的支持,...
│ │ │ 275test-3.txt │ │ │ 275test-4.txt │ │ │ 275test.txt │ │ │ answer-1.txt │ │ │ answer-2.txt │ │ │ answer-3.txt │ │ │ answer-4.txt │ │ │ Desktop_.ini │ │ │ 考题_1.doc │ ...
│ │ │ 275test-3.txt │ │ │ 275test-4.txt │ │ │ 275test.txt │ │ │ answer-1.txt │ │ │ answer-2.txt │ │ │ answer-3.txt │ │ │ answer-4.txt │ │ │ Desktop_.ini │ │ │ 考题_1.doc │ ...
│ │ │ 275test-3.txt │ │ │ 275test-4.txt │ │ │ 275test.txt │ │ │ answer-1.txt │ │ │ answer-2.txt │ │ │ answer-3.txt │ │ │ answer-4.txt │ │ │ Desktop_.ini │ │ │ 考题_1.doc │ ...
parboiled 是一个纯Java库提供了一种轻量级,易于使用,功能强大和优雅的PEG(解析表达式语法)分析设施。你定义的Java源代码的语法规则,直接,没有必要专门编写和维护,外部语法文件。同时保持蒸提供全面的支持,...
parboiled 是一个纯Java库提供了一种轻量级,易于使用,功能强大和优雅的PEG(解析表达式语法)分析设施。你定义的Java源代码的语法规则,直接,没有必要专门编写和维护,外部语法文件。同时保持蒸提供全面的支持,...
parboiled 是一个纯Java库提供了一种轻量级,易于使用,功能强大和优雅的PEG(解析表达式语法)分析设施。你定义的Java源代码的语法规则,直接,没有必要专门编写和维护,外部语法文件。同时保持蒸提供全面的支持,...
parboiled 是一个纯Java库提供了一种轻量级,易于使用,功能强大和优雅的PEG(解析表达式语法)分析设施。你定义的Java源代码的语法规则,直接,没有必要专门编写和维护,外部语法文件。同时保持蒸提供全面的支持,...
parboiled 是一个纯Java库提供了一种轻量级,易于使用,功能强大和优雅的PEG(解析表达式语法)分析设施。你定义的Java源代码的语法规则,直接,没有必要专门编写和维护,外部语法文件。同时保持蒸提供全面的支持,...
parboiled 是一个纯Java库提供了一种轻量级,易于使用,功能强大和优雅的PEG(解析表达式语法)分析设施。你定义的Java源代码的语法规则,直接,没有必要专门编写和维护,外部语法文件。同时保持蒸提供全面的支持,...