HTTP 会话相关功能由
如果用户当前未进行身份验证,则过滤器将检查是否已经请求了无效的会话 ID(例如,由于超时),并且如果设置了
<http> <custom-filter position="FORM_LOGIN_FILTER" ref="myAuthFilter" /> <session-management session-authentication-strategy-ref="sas"/> </http> <beans:bean id="myAuthFilter" class= "org.springframework.security.web.authentication.UsernamePasswordAuthenticationFilter"> <beans:property name="sessionAuthenticationStrategy" ref="sas" /> ... </beans:bean> <beans:bean id="sas" class= "org.springframework.security.web.authentication.session.SessionFixationProtectionStrategy" />
注意,如果将 bean 存储在实现 Spring Security 能够防止主体对同一应用程序的并发身份验证超过指定次数。许多 ISV 利用这个特性来实施许可,而网络管理员喜欢这个特性,因为它有助于防止人们共享登录名。例如,你可以阻止用户 "Batman" 从两个不同的会话登录到 web 应用程序。你可以在他们尝试登录之前阻止他们的先前登录,或者你可以报告错误,防止第二次登录。注意,如果你正在使用第二种方法,那么没有显式注销的用户(例如刚刚关闭浏览器的用户)将无法再次登录,直到其原始会话期满。 命名空间支持并发控制,因此简单的配置请查看更早的命名空间章节。有时你需要定制一些东西。
该实现使用了
要使用并发会话支持,你需要向 <listener> <listener-class> org.springframework.security.web.session.HttpSessionEventPublisher </listener-class> </listener>
此外,你还需要向你的 <http> <custom-filter position="CONCURRENT_SESSION_FILTER" ref="concurrencyFilter" /> <custom-filter position="FORM_LOGIN_FILTER" ref="myAuthFilter" /> <session-management session-authentication-strategy-ref="sas"/> </http> <beans:bean id="redirectSessionInformationExpiredStrategy" class="org.springframework.security.web.session.SimpleRedirectSessionInformationExpiredStrategy"> <beans:constructor-arg name="invalidSessionUrl" value="/session-expired.htm" /> </beans:bean> <beans:bean id="concurrencyFilter" class="org.springframework.security.web.session.ConcurrentSessionFilter"> <beans:constructor-arg name="sessionRegistry" ref="sessionRegistry" /> <beans:constructor-arg name="sessionInformationExpiredStrategy" ref="redirectSessionInformationExpiredStrategy" /> </beans:bean> <beans:bean id="myAuthFilter" class= "org.springframework.security.web.authentication.UsernamePasswordAuthenticationFilter"> <beans:property name="sessionAuthenticationStrategy" ref="sas" /> <beans:property name="authenticationManager" ref="authenticationManager" /> </beans:bean> <beans:bean id="sas" class="org.springframework.security.web.authentication.session.CompositeSessionAuthenticationStrategy"> <beans:constructor-arg> <beans:list> <beans:bean class="org.springframework.security.web.authentication.session.ConcurrentSessionControlAuthenticationStrategy"> <beans:constructor-arg ref="sessionRegistry"/> <beans:property name="maximumSessions" value="1" /> <beans:property name="exceptionIfMaximumExceeded" value="true" /> </beans:bean> <beans:bean class="org.springframework.security.web.authentication.session.SessionFixationProtectionStrategy"> </beans:bean> <beans:bean class="org.springframework.security.web.authentication.session.RegisterSessionAuthenticationStrategy"> <beans:constructor-arg ref="sessionRegistry"/> </beans:bean> </beans:list> </beans:constructor-arg> </beans:bean> <beans:bean id="sessionRegistry" class="org.springframework.security.core.session.SessionRegistryImpl" />
将监听器添加到
通过命名空间或使用普通 bean 设置并发控制具有以下有用的副作用,即为你提供可以直接在应用程序中使用的
[17] 由于在身份验证请求期间不会调用过滤器,因此
通常认为,采用 "deny-by-default" 是一种良好的安全实践,其中明确指定允许和不允许其他操作。定义未经验证的用户可访问的是类似的情况,特别是对于 web 应用程序。许多网站要求用户必须为除了部分 URL(例如首页和登录页面)以外的任何东西进行认证。在这种情况下,为这些特定的 URL 定义访问配置属性比为每个安全资源定义访问配置属性更容易。换言之,有时最好说
这就是匿名身份验证的含义。请注意,匿名身份验证的用户和未经身份验证的用户之间没有真正的概念差异。Spring Security 的匿名身份验证只为你提供了更方便的配置访问控制属性的方法。例如,对 servlet API 调用(如
在其他情况下,匿名身份验证是有用的,例如当审计拦截器查询
当使用 HTTP 配置 Spring Security 3.0 时,会自动提供匿名身份验证支持,并且可以使用
三个类一起提供匿名身份验证功能。 <bean id="anonymousAuthFilter" class="org.springframework.security.web.authentication.AnonymousAuthenticationFilter"> <property name="key" value="foobar"/> <property name="userAttribute" value="anonymousUser,ROLE_ANONYMOUS"/> </bean> <bean id="anonymousAuthenticationProvider" class="org.springframework.security.authentication.AnonymousAuthenticationProvider"> <property name="key" value="foobar"/> </bean>
正如前面所解释的,匿名身份验证的好处是所有的 URI 模式都可以应用于安全性。例如: <bean id="filterSecurityInterceptor" class="org.springframework.security.web.access.intercept.FilterSecurityInterceptor"> <property name="authenticationManager" ref="authenticationManager"/> <property name="accessDecisionManager" ref="httpRequestAccessDecisionManager"/> <property name="securityMetadata"> <security:filter-security-metadata-source> <security:intercept-url pattern='/index.jsp' access='ROLE_ANONYMOUS,ROLE_USER'/> <security:intercept-url pattern='/hello.htm' access='ROLE_ANONYMOUS,ROLE_USER'/> <security:intercept-url pattern='/logoff.jsp' access='ROLE_ANONYMOUS,ROLE_USER'/> <security:intercept-url pattern='/login.jsp' access='ROLE_ANONYMOUS,ROLE_USER'/> <security:intercept-url pattern='/**' access='ROLE_USER'/> </security:filter-security-metadata-source>" + </property> </bean>
围绕匿名身份验证讨论的是
在上面的拦截器配置中,你经常会看到
[18] |