标签:member 部分 false remember move alter HERE correct erro
Most Spring Security users will be using the framework in applications which make user of HTTP and the Servlet API. In this part, we’ll take a look at how Spring Security provides authentication and access-control features for the web layer of an application. We’ll look behind the facade of the namespace and see which classes and interfaces are actually assembled to provide web-layer security. In some situations it is necessary to use traditional bean configuration to provide full control over the configuration, so we’ll also see how to configure these classes directly without the namespace.
Spring Security’s web infrastructure is based entirely on standard servlet filters. It doesn’t use servlets or any other servlet-based frameworks (such as Spring MVC) internally, so it has no strong links to any particular web technology. It deals in HttpServletRequest
s and HttpServletResponse
s and doesn’t care whether the requests come from a browser, a web service client, an HttpInvoker
or an AJAX application.
When using servlet filters, you obviously need to declare them in your web.xml
, or they will be ignored by the servlet container. In Spring Security, the filter classes are also Spring beans defined in the application context and thus able to take advantage of Spring’s rich dependency-injection facilities and lifecycle interfaces. Spring’s DelegatingFilterProxy
provides the link between web.xml
and the application context.
DelegatingFilterProxy
, you will see something like this in the web.xml
file:<filter> <filter-name>myFilter</filter-name> <filter-class>org.springframework.web.filter.DelegatingFilterProxy</filter-class> </filter> <filter-mapping> <filter-name>myFilter</filter-name> <url-pattern>/*</url-pattern> </filter-mapping>
Notice that the filter is actually a DelegatingFilterProxy
, and not the class that will actually implement the logic of the filter. What DelegatingFilterProxy
does is delegate the Filter
‘s methods through to a bean which is obtained from the Spring application context. This enables the bean to benefit from the Spring web application context lifecycle support and configuration flexibility. The bean must implement javax.servlet.Filter
and it must have the same name as that in the filter-name
element. Read the Javadoc for DelegatingFilterProxy
for more information
Spring Security’s web infrastructure should only be used by delegating to an instance of FilterChainProxy
. The security filters should not be used by themselves. In theory you could declare each Spring Security filter bean that you require in your application context file and add a corresponding DelegatingFilterProxy
entry to web.xml
for each filter, making sure that they are ordered correctly, but this would be cumbersome and would clutter up the web.xml
file quickly if you have a lot of filters. FilterChainProxy
lets us add a single entry to web.xml
and deal entirely with the application context file for managing our web security beans. It is wired using a DelegatingFilterProxy
, just like in the example above, but with the filter-name
set to the bean name "filterChainProxy". The filter chain is then declared in the application context with the same bean name. Here’s an example:
<bean id="filterChainProxy" class="org.springframework.security.web.FilterChainProxy"> <constructor-arg> <list> <sec:filter-chain pattern="/restful/**" filters=" securityContextPersistenceFilterWithASCFalse, basicAuthenticationFilter, exceptionTranslationFilter, filterSecurityInterceptor" /> <sec:filter-chain pattern="/**" filters=" securityContextPersistenceFilterWithASCTrue, formLoginFilter, exceptionTranslationFilter, filterSecurityInterceptor" /> </list> </constructor-arg> </bean>
The namespace element filter-chain
is used for convenience to set up the security filter chain(s) which are required within the application. [6]. It maps a particular URL pattern to a list of filters built up from the bean names specified in the filters
element, and combines them in a bean of type SecurityFilterChain
. The pattern
attribute takes an Ant Paths and the most specific URIs should appear first [7]. At runtime the FilterChainProxy
will locate the first URI pattern that matches the current web request and the list of filter beans specified by the filters
attribute will be applied to that request. The filters will be invoked in the order they are defined, so you have complete control over the filter chain which is applied to a particular URL.
SecurityContextPersistenceFilter
s in the filter chain (ASC
is short for allowSessionCreation
, a property of SecurityContextPersistenceFilter
). As web services will never present a jsessionid
on future requests, creating HttpSession
s for such user agents would be wasteful. If you had a high-volume application which required maximum scalability, we recommend you use the approach shown above. For smaller applications, using a single SecurityContextPersistenceFilter
(with its default allowSessionCreation
as true
) would likely be sufficient.FilterChainProxy
does not invoke standard filter lifecycle methods on the filters it is configured with. We recommend you use Spring’s application context lifecycle interfaces as an alternative, just as you would for any other Spring bean.DelegatingFilterProxy
with the name "springSecurityFilterChain". You should now be able to see that this is the name of the FilterChainProxy
which is created by the namespace.You can use the attribute filters = "none"
as an alternative to supplying a filter bean list. This will omit the request pattern from the security filter chain entirely. Note that anything matching this path will then have no authentication or authorization services applied and will be freely accessible. If you want to make use of the contents of the SecurityContext
contents during a request, then it must have passed through the security filter chain. Otherwise the SecurityContextHolder
will not have been populated and the contents will be null.
The order that filters are defined in the chain is very important. Irrespective of which filters you are actually using, the order should be as follows:
ChannelProcessingFilter
, because it might need to redirect to a different protocolSecurityContextPersistenceFilter
, so a SecurityContext
can be set up in the SecurityContextHolder
at the beginning of a web request, and any changes to the SecurityContext
can be copied to the HttpSession
when the web request ends (ready for use with the next web request)ConcurrentSessionFilter
, because it uses the SecurityContextHolder
functionality and needs to update the SessionRegistry
to reflect ongoing requests from the principalUsernamePasswordAuthenticationFilter
, CasAuthenticationFilter
, BasicAuthenticationFilter
etc - so that the SecurityContextHolder
can be modified to contain a valid Authentication
request tokenSecurityContextHolderAwareRequestFilter
, if you are using it to install a Spring Security aware HttpServletRequestWrapper
into your servlet containerJaasApiIntegrationFilter
, if a JaasAuthenticationToken
is in the SecurityContextHolder
this will process the FilterChain
as the Subject
in the JaasAuthenticationToken
RememberMeAuthenticationFilter
, so that if no earlier authentication processing mechanism updated the SecurityContextHolder
, and the request presents a cookie that enables remember-me services to take place, a suitable remembered Authentication
object will be put thereAnonymousAuthenticationFilter
, so that if no earlier authentication processing mechanism updated the SecurityContextHolder
, an anonymous Authentication
object will be put thereExceptionTranslationFilter
, to catch any Spring Security exceptions so that either an HTTP error response can be returned or an appropriate AuthenticationEntryPoint
can be launchedFilterSecurityInterceptor
, to protect web URIs and raise exceptions when access is deniedSpring Security(三十七):Part IV. Web Application Security
标签:member 部分 false remember move alter HERE correct erro
原文地址:https://www.cnblogs.com/shuaiandjun/p/10146655.html