- 浏览: 1193553 次
- 性别:
- 来自: 杭州
文章分类
最新评论
-
insistboy:
写的太棒了,受不了
WebLogic11g-创建域(Domain) -
goldyeah:
厉害了 困扰我大半个月的问题解决了 谢谢博主
WebLogic11g-单双向SSL配置(以Springside3为例) -
zy315351965:
404伤不起
开源流程引擎Snaker -
nannan408:
双向的时候谷歌提示“不接受您的登录证书,或者您可能没有提供登录 ...
WebLogic11g-单双向SSL配置(以Springside3为例) -
一颗赛艇:
不成功啊。启动有问题 <Security> < ...
WebLogic11g-单双向SSL配置(以Springside3为例)
Sping Security3对于SSL的支持仅仅表现在对需要拦截的url(标签intercept-url)设置requires-channel=https属性。
如果一个url设置了requires-channel为https,那么该url在http的访问会直接重定向到https的通道中去。后面再具体分析。
首先需要在应用中配置SSL的支持,具体配置方法可参考
http://lengyun3566.iteye.com/blog/1141347
Sping Security3支持SSL分别表现下面几个类
类名称 | 用途描述 |
ChannelProcessingFilter | 通道处理过滤器。只要intercept-url标签中包含requires-channel属性,该过滤器就被创建 |
ChannelDecisionManagerImpl | 通道决策管理器。该管理器包含两个ChannelProcessor实例用于处理安全、不安全两种Channel方式 |
SecureChannelProcessor | 安全通道处理器 |
InsecureChannelProcessor |
不安全通道处理器 |
AbstractRetryEntryPoint | 抽象的通道重操作入口点,是entrypoint的父类 |
RetryWithHttpEntryPoint | 如果当前以安全通道访问不安全通道,也可以通过http的入口点重定向到不安全通道中 |
RetryWithHttpsEntryPoint | 如果当前以不安全通道访问安全通道,就要通过https的入口点重定向到安全通道中 |
PortMapperImpl | 端口映射处理。主要是针对非默认端口(80、8080、443、8443)的情况 |
看ChannelProcessingFilter过滤器的作用
ChannelProcessingFilter首先检查当前请求的url是否已配置了requires-channel属性,如果没配置,不处理。如果配置了,就把决策权交给ChannelDecisionManagerImpl处理。
ChannelProcessingFilter对应类路径:org.springframework.security.web.access.channel.ChannelProcessingFilter
具体源码如下
public void doFilter(ServletRequest req, ServletResponse res, FilterChain chain) throws IOException, ServletException { HttpServletRequest request = (HttpServletRequest) req; HttpServletResponse response = (HttpServletResponse) res; FilterInvocation fi = new FilterInvocation(request, response, chain); //获取url的权限配置信息 Collection<ConfigAttribute> attr = this.securityMetadataSource.getAttributes(fi); if (attr != null) { if (logger.isDebugEnabled()) { logger.debug("Request: " + fi.toString() + "; ConfigAttributes: " + attr); } //把决策权交给channelDecisionManager处理 channelDecisionManager.decide(fi, attr); if (fi.getResponse().isCommitted()) { return; } } chain.doFilter(request, response); }
接着看ChannelDecisionManagerImpl的作用
ChannelDecisionManagerImpl根据requires-channel的值做相应处理,requires-channel值有以下三种
any:任何通道都支持。决策管理器不做处理
https:只支持安全通道。决策管理器把决策任务交给ChannelProcessor列表循环处理
http:只支持http。决策管理器把决策任务交给ChannelProcessor列表循环处理
ChannelDecisionManagerImpl的源码为:
public void decide(FilterInvocation invocation, Collection<ConfigAttribute> config) throws IOException, ServletException { Iterator<ConfigAttribute> attrs = config.iterator(); //判断是否为any值 while (attrs.hasNext()) { ConfigAttribute attribute = attrs.next(); if (ANY_CHANNEL.equals(attribute.getAttribute())) { return; } } //循环ChannelProcessor列表执行decide for (ChannelProcessor processor : channelProcessors) { processor.decide(invocation, config); if (invocation.getResponse().isCommitted()) { break; } } }
继续看ChannelProcessor 的作用
实际上在构造ChannelDecisionManager的bean时,已经注入了两个ChannelProcessor ,分别是SecureChannelProcessor、InsecureChannelProcessor
先看SecureChannelProcessor(负责处理安全通道)执行过程
public void decide(FilterInvocation invocation, Collection<ConfigAttribute> config) throws IOException, ServletException { Assert.isTrue((invocation != null) && (config != null), "Nulls cannot be provided"); for (ConfigAttribute attribute : config) { if (supports(attribute)) { if (!invocation.getHttpRequest().isSecure()) { entryPoint.commence(invocation.getRequest(), invocation.getResponse()); } } } }
根据当前的请求是否安全,进行相应的处理。实际工作的是抽象的父类AbstractRetryEntryPoint的commence完成
AbstractRetryEntryPoint的commence方法源码:
public void commence(HttpServletRequest request, HttpServletResponse res) throws IOException, ServletException { String pathInfo = request.getPathInfo(); String queryString = request.getQueryString(); String contextPath = request.getContextPath(); String destination = request.getServletPath() + ((pathInfo == null) ? "" : pathInfo) + ((queryString == null) ? "" : ("?" + queryString)); String redirectUrl = contextPath; //获取当前请求所在端口 Integer currentPort = new Integer(portResolver.getServerPort(request)); //根据当前端口获得映射的端口(需要配置port-mappings标签),如果是http的访问,则获取映射的https端口,如果是https的访问,则获取相应的http端口 Integer redirectPort = getMappedPort(currentPort); //如果获取到匹配端口,则根据当前请求构造重定向请求的url if (redirectPort != null) { boolean includePort = redirectPort.intValue() != standardPort; redirectUrl = scheme + request.getServerName() + ((includePort) ? (":" + redirectPort) : "") + contextPath + destination; } if (logger.isDebugEnabled()) { logger.debug("Redirecting to: " + redirectUrl); } //执行重定向操作 res.sendRedirect(res.encodeRedirectURL(redirectUrl)); }
通过以上分析,应该很清楚的知道:
如果以http的方式登录到应用中,再访问配置了requires-channel=https的url时,就会重定向到https的通道去,以SSL方式访问。
如果以https的方式登录到应用中,再访问配置了requires-channel=http的url时,就会重定向到http的通道去,以不安全的方式访问。
评论
我也遇到相似的问题. 用命名空间可以, 但是用自己配置bean的方式, 却提示不能是requires-channel这个属性.
如果自己配置的bean,是不支持requires-channel属性的。因为这是使用spring schema的xsd约束的。
使用命名空间requires-channel="https"也不行么?如果不行,我研究下3.11版本与3.02版本的差异
到最后我是这样配置的:
<bean id="channelProcessingFilter" class="org.springframework.security.web.access.channel.ChannelProcessingFilter">
<property name="securityMetadataSource" ref="defaultFilterInvocationSecurityMetadataSource"/>
<property name="channelDecisionManager" ref="channelDecisionManager"/>
</bean>
<bean id="defaultFilterInvocationSecurityMetadataSource"
class="org.springframework.security.web.access.intercept.DefaultFilterInvocationSecurityMetadataSource">
<constructor-arg name="requestMap">
<map>
<entry>
<key>
<bean class="org.springframework.security.web.util.AntPathRequestMatcher">
<constructor-arg name="pattern" value="/login.do"/>
</bean>
</key>
<list>
<bean class="org.springframework.security.access.SecurityConfig">
<constructor-arg name="config" value="REQUIRES_SECURE_CHANNEL"/>
</bean>
</list>
</entry>
</map>
</constructor-arg>
</bean>
上面是配置ChannelProcessFilter.
<bean id="filterSecurityInterceptor" class="org.springframework.security.web.access.intercept.FilterSecurityInterceptor">
<property name="authenticationManager" ref="customAuthenticationManager"/>
<property name="accessDecisionManager" ref="affirmativeBased"/>
<property name="securityMetadataSource">
<security:filter-security-metadata-source id="expressionBasedFilterInvocationSecurityMetadataSource" use-expressions="true" lowercase-comparisons="true">
<security:intercept-url pattern="/login.do" access="permitAll"/>
</security:filter-security-metadata-source>
</property>
</bean>
由于没法使用requires-channel, 所以intercept-url只使用pattern, access属性. filters属性有不能用. 不知道在哪里配置.
目前发现3.1和3.0x的区别是, 用bean方式配置时, 要用构造注入而不是属性注入.
这篇文章没有对SSL的bean初始化进行分析。
最简单的方法,你自己配置bean时,直接打开这个类的源码,查看某个属性是通过构造注入,还是set注入就知道。
Spring Security里面很多类都是构造注入的
我也遇到相似的问题. 用命名空间可以, 但是用自己配置bean的方式, 却提示不能是requires-channel这个属性.
如果自己配置的bean,是不支持requires-channel属性的。因为这是使用spring schema的xsd约束的。
使用命名空间requires-channel="https"也不行么?如果不行,我研究下3.11版本与3.02版本的差异
到最后我是这样配置的:
<bean id="channelProcessingFilter" class="org.springframework.security.web.access.channel.ChannelProcessingFilter">
<property name="securityMetadataSource" ref="defaultFilterInvocationSecurityMetadataSource"/>
<property name="channelDecisionManager" ref="channelDecisionManager"/>
</bean>
<bean id="defaultFilterInvocationSecurityMetadataSource"
class="org.springframework.security.web.access.intercept.DefaultFilterInvocationSecurityMetadataSource">
<constructor-arg name="requestMap">
<map>
<entry>
<key>
<bean class="org.springframework.security.web.util.AntPathRequestMatcher">
<constructor-arg name="pattern" value="/login.do"/>
</bean>
</key>
<list>
<bean class="org.springframework.security.access.SecurityConfig">
<constructor-arg name="config" value="REQUIRES_SECURE_CHANNEL"/>
</bean>
</list>
</entry>
</map>
</constructor-arg>
</bean>
上面是配置ChannelProcessFilter.
<bean id="filterSecurityInterceptor" class="org.springframework.security.web.access.intercept.FilterSecurityInterceptor">
<property name="authenticationManager" ref="customAuthenticationManager"/>
<property name="accessDecisionManager" ref="affirmativeBased"/>
<property name="securityMetadataSource">
<security:filter-security-metadata-source id="expressionBasedFilterInvocationSecurityMetadataSource" use-expressions="true" lowercase-comparisons="true">
<security:intercept-url pattern="/login.do" access="permitAll"/>
</security:filter-security-metadata-source>
</property>
</bean>
由于没法使用requires-channel, 所以intercept-url只使用pattern, access属性. filters属性有不能用. 不知道在哪里配置.
目前发现3.1和3.0x的区别是, 用bean方式配置时, 要用构造注入而不是属性注入.
我也遇到相似的问题. 用命名空间可以, 但是用自己配置bean的方式, 却提示不能是requires-channel这个属性.
如果自己配置的bean,是不支持requires-channel属性的。因为这是使用spring schema的xsd约束的。
使用命名空间requires-channel="https"也不行么?如果不行,我研究下3.11版本与3.02版本的差异
我也遇到相似的问题. 用命名空间可以, 但是用自己配置bean的方式, 却提示不能是requires-channel这个属性.
求源码,小弟不胜感激bingfengfzl@163.com
源码很简单的,仅仅是intercept-url配置中增加requires-channel属性而已
<security:http auto-config="true" > <security:port-mappings> <security:port-mapping http="8888" https="8443"/> </security:port-mappings> <security:form-login login-page="/login.jsp"/> <security:logout logout-success-url="/login.jsp" invalidate-session="true"/> <security:intercept-url pattern="/login.jsp*" filters="none"/> <security:intercept-url pattern="/admin.jsp*" access="ROLE_USER,ROLE_ADMIN" requires-channel="https"/> <security:intercept-url pattern="/UserList.do*" access="ROLE_USER,ROLE_ADMIN" requires-channel="http"/> <security:intercept-url pattern="/index.jsp*" access="ROLE_USER,ROLE_ADMIN"/> <security:intercept-url pattern="/**" access="ROLE_USER,ROLE_ADMIN"/> <security:session-management session-fixation-protection="none"> </security:session-management> </security:http>
求源码,小弟不胜感激bingfengfzl@163.com
发表评论
-
Spring Security3源码分析-电子书下载
2012-07-30 14:34 8545提供电子书下载链接。 -
Spring Security3源码分析-CAS支持
2012-05-13 21:03 25777Spring Security3对CAS的支持主要在这个spr ... -
Spring Security3源码分析-认证授权分析
2012-05-09 21:59 6363前面分析了FilterChainProxy执行过程,也对常用的 ... -
Spring Security3源码分析-Filter链排序分析
2012-05-09 14:39 15303通过前面Spring Security提供的各种Filter的 ... -
Spring Security3源码分析-RequestCacheAwareFilter分析
2012-05-09 12:55 4881RequestCacheAwareFilter过滤器对应的类路 ... -
Spring Security3源码分析-ExceptionTranslationFilter分析
2012-05-09 10:03 7802ExceptionTranslationFilter过滤器对应 ... -
Spring Security3源码分析-SessionManagementFilter分析-下
2012-05-08 21:03 6336很多spring security3资料在 ... -
Spring Security3源码分析-SessionManagementFilter分析-上
2012-05-08 17:26 10920SessionManagementFilter过滤 ... -
Spring Security3源码分析-AnonymousAuthenticationFilter分析
2012-05-08 10:32 5196AnonymousAuthenticationFilter ... -
Spring Security3源码分析-BasicAuthenticationFilter分析
2012-05-08 09:24 9603BasicAuthenticationFilter过滤器对应的 ... -
Spring Security3源码分析-FilterSecurityInterceptor分析
2012-05-07 17:31 15285FilterSecurityInterceptor过滤器对应的 ... -
Spring Security3源码分析-SecurityContextHolderAwareRequestFilter分析
2012-05-07 10:34 6819SecurityContextHolderAwareReque ... -
Spring Security3源码分析-RememberMeAuthenticationFilter分析
2012-05-06 22:33 5946RememberMeAuthenticationFilter过 ... -
Spring Security3源码分析-UsernamePasswordAuthenticationFilter分析
2012-05-06 11:54 24860UsernamePasswordAuthenticationF ... -
Spring Security3源码分析-LogoutFilter分析
2012-05-06 10:18 10296LogoutFilter过滤器对应的类路径为 org.spri ... -
Spring Security3源码分析-SecurityContextPersistenceFilter分析
2012-05-06 08:22 8725通过观察Filter的名字,就能大概猜出来这个过滤器的作用,是 ... -
Spring Security3源码分析-FilterChainProxy执行过程分析
2012-05-06 07:48 4243通过FilterChainProxy的初始化、自定义标签的分析 ... -
Spring Security3源码分析-authentication-manager标签解析
2012-05-05 16:13 21679讲解完http标签的解析过程,authentication-m ... -
Spring Security3源码分析-http标签解析
2012-05-05 15:29 8439在FilterChainProxy初始化的 ... -
Spring Security3源码分析-FilterChainProxy初始化
2012-05-04 16:57 20049很久没有更新博客了,最近对Spring Security做了比 ...
相关推荐
Java 3DMenu 界面源码,有人说用到游戏中不错,其实平时我信编写Java应用程序时候也能用到吧,不一定非要局限于游戏吧,RES、SRC资源都有,都在压缩包内。 Java zip压缩包查看程序源码 1个目标文件 摘要:Java源码...
Java 3DMenu 界面源码,有人说用到游戏中不错,其实平时我信编写Java应用程序时候也能用到吧,不一定非要局限于游戏吧,RES、SRC资源都有,都在压缩包内。 Java zip压缩包查看程序源码 1个目标文件 摘要:Java源码...
3. 支持缓存数据分区规则的定义 4. 使用redis作缓存时,支持list类型的高级数据结构,更适合论坛帖子列表这种类型的数据 5. 支持混合使用redis缓存和memcached缓存。可以将列表数据缓存到redis中,其他kv结构数据...
3. 支持缓存数据分区规则的定义 4. 使用redis作缓存时,支持list类型的高级数据结构,更适合论坛帖子列表这种类型的数据 5. 支持混合使用redis缓存和memcached缓存。可以将列表数据缓存到redis中,其他kv结构数据...
3. 支持缓存数据分区规则的定义 4. 使用redis作缓存时,支持list类型的高级数据结构,更适合论坛帖子列表这种类型的数据 5. 支持混合使用redis缓存和memcached缓存。可以将列表数据缓存到redis中,其他kv结构数据...
3. 支持缓存数据分区规则的定义 4. 使用redis作缓存时,支持list类型的高级数据结构,更适合论坛帖子列表这种类型的数据 5. 支持混合使用redis缓存和memcached缓存。可以将列表数据缓存到redis中,其他kv结构数据...
3. 支持缓存数据分区规则的定义 4. 使用redis作缓存时,支持list类型的高级数据结构,更适合论坛帖子列表这种类型的数据 5. 支持混合使用redis缓存和memcached缓存。可以将列表数据缓存到redis中,其他kv结构数据...
3. 支持缓存数据分区规则的定义 4. 使用redis作缓存时,支持list类型的高级数据结构,更适合论坛帖子列表这种类型的数据 5. 支持混合使用redis缓存和memcached缓存。可以将列表数据缓存到redis中,其他kv结构数据...
3. 支持缓存数据分区规则的定义 4. 使用redis作缓存时,支持list类型的高级数据结构,更适合论坛帖子列表这种类型的数据 5. 支持混合使用redis缓存和memcached缓存。可以将列表数据缓存到redis中,其他kv结构数据...
3. 支持缓存数据分区规则的定义 4. 使用redis作缓存时,支持list类型的高级数据结构,更适合论坛帖子列表这种类型的数据 5. 支持混合使用redis缓存和memcached缓存。可以将列表数据缓存到redis中,其他kv结构数据...
3. 支持缓存数据分区规则的定义 4. 使用redis作缓存时,支持list类型的高级数据结构,更适合论坛帖子列表这种类型的数据 5. 支持混合使用redis缓存和memcached缓存。可以将列表数据缓存到redis中,其他kv结构数据...
3. 支持缓存数据分区规则的定义 4. 使用redis作缓存时,支持list类型的高级数据结构,更适合论坛帖子列表这种类型的数据 5. 支持混合使用redis缓存和memcached缓存。可以将列表数据缓存到redis中,其他kv结构数据...
3. 支持缓存数据分区规则的定义 4. 使用redis作缓存时,支持list类型的高级数据结构,更适合论坛帖子列表这种类型的数据 5. 支持混合使用redis缓存和memcached缓存。可以将列表数据缓存到redis中,其他kv结构数据...
3. 支持缓存数据分区规则的定义 4. 使用redis作缓存时,支持list类型的高级数据结构,更适合论坛帖子列表这种类型的数据 5. 支持混合使用redis缓存和memcached缓存。可以将列表数据缓存到redis中,其他kv结构数据...
3. 支持缓存数据分区规则的定义 4. 使用redis作缓存时,支持list类型的高级数据结构,更适合论坛帖子列表这种类型的数据 5. 支持混合使用redis缓存和memcached缓存。可以将列表数据缓存到redis中,其他kv结构数据...