Spring Security session 处置

Spring Security session 处置

session 处置

Spring Security 经过 http 元素下的子元素 session-management 供给了对 Http Session 处置的扶助。

检验和测定 session 超时

Spring Security 不妨在用户运用仍旧超时的 sessionId 举行乞求时将用户启发到指定的页面。这个不妨经过如次摆设来实行。

<security:http>

...

<!-- session 处置,invalid-session-url 指定运用仍旧超时的 sessionId 举行乞求须要重定向的页面 -->

<security:session-management invalid-session-url="/session_timeout.jsp"/>

...

</security:http>

须要提防的是 session 超时的重定向页面该当是不须要认证的,要不再重定向到 session 超时页面时会径直转到用户登录页面。其余即使你运用这种办法来检验和测定 session 超时,当你退出了登录,而后在没相关闭欣赏器的情景下又从新举行了登录,Spring Security 大概会缺点的汇报 session 仍旧超时。这是由于纵然你仍旧退出登录了,但当你树立 session 失效时,对应生存 session 消息的 cookie 并没有被废除,等下次乞求时仍旧会运用之前的 sessionId 举行乞求。处置方法是表露的设置用户在退出登录时简略对应的生存 session 消息的 cookie。

<security:http>

...

<!-- 退出登录时简略 session 对应的 cookie -->

<security:logout delete-cookies="JSESSIONID"/>

...

</security:http>

其余,Spring Security 并不保护这对一切的 Servlet 容器都灵验,究竟在你的容器上有没灵验,须要你本人举行试验。

concurrency-control

常常情景下,在你的运用中你大概只蓄意同一用户在同声登录屡次时只能有一个是胜利登入你的体例的,常常对应的动作是后一次登录将使前一次登录作废,大概径直控制后一次登录。Spring Security 的 session-management 为咱们供给了这种控制。

开始须要咱们在 web.xml 中设置如次监听器。

<listener>

<listener-class>org.springframework.security.web.session.HttpSessionEventPublisher</listener-class>

</listener>

在 session-management 元素下有一个 concurrency-control 元素是用来控制同一用户在运用中同声承诺生存的仍旧经过认证的 session 数目。这个值默许是 1,不妨经过 concurrency-control 元素的 max-sessions 属性来指定。

<security:http auto-config="true">

...

<security:session-management>

<security:concurrency-control max-sessions="1"/>

</security:session-management>

...

</security:http>

当同一用户同声生存的仍旧经过认证的 session 数目胜过了 max-sessions 所指定的值时,Spring Security 的默许战略是将先前的设为失效。即使要控制用户再次登录不妨树立 concurrency-control 的 error-if-maximum-exceeded 的值为 true。

<security:http auto-config="true">

...

<security:session-management>

<security:concurrency-control max-sessions="1" error-if-maximum-exceeded="true"/>

</security:session-management>

...

</security:http>

树立 error-if-maximum-exceeded 为 true 后即使你之前仍旧登录了,而后想再次登录,那么体例将会中断你的登录,同声将重定向到由 form-login 指定的 authentication-failure-url。即使你的再次登录是经过 Remember-Me 来实行的,那么将不会转到 authentication-failure-url,而是归来未受权的缺点码 401 给存户端,即使你仍旧想重定向一个指定的页面,那么你不妨经过 session-management 的 session-authentication-error-url 属性来指定,同声须要指定该 url 为不受 Spring Security 处置,即经过 http 元素树立其 secure=”none”。

<security:http security="none" pattern="/none/**" />

<security:http>

<security:form-login/>

<security:logout/>

<security:intercept-url pattern="/**" access="ROLE_USER"/>

<!-- session-authentication-error-url 必需是不受 Spring Security 处置的 -->

<security:session-management session-authentication-error-url="/none/session_authentication_error.jsp">

<security:concurrency-control max-sessions="1" error-if-maximum-exceeded="true"/>

</security:session-management>

<security:remember-me data-source-ref="dataSource"/>

</security:http>

在上述摆设中咱们摆设了 session-authentication-error-url 为 “/none/session_authentication_error.jsp”,同声咱们经过 指定了以 “/none” 发端的一切 URL 都不受 Spring Security 遏制,如许当用户举行登录此后,再次经过 Remember-Me 举行机动登录时就会重定向到 “/none/session_authentication_error.jsp” 了。

在上述摆设中干什么咱们须要经过 指定咱们的 session-authentication-error-url 不受 Spring Security 遏制呢?把它换成 不行吗?这就波及到之前所引见的它们两者之间的辨别了。前者表白不运用任何 Spring Security 过滤器,天然也就不须要经过 Spring Security 的认证了,尔后者是会被 Spring Security 的 FilterChain 举行过滤的,不过其对应的 URL 不妨隐姓埋名考察,即不须要登录就可考察。运用后者时,REMEMBER_ME_FILTER 检验和测定到用户没有登录,同声其又供给了 Remember-Me 的关系消息,这将使得 REMEMBER_ME_FILTER 举行机动登录,那么在机动登录时因为咱们控制了同一用户同一功夫只能登录一次,厥后者将被中断登录,这个功夫将重定向到 session-authentication-error-url,重定向考察 session-authentication-error-url 时,过程 REMEMBER_ME_FILTER 时又会机动登录,如许就产生了一个死轮回。以是 session-authentication-error-url 该当运用 树立为不受 Spring Security 遏制,而不是运用 。

其余,不妨经过 expired-url 属性指定当用户试验运用一个因为其再次登录引导 session 超时的 session 时所要跳转的页面。同声须要提防树立该 URL 为不须要举行认证。

<security:http auto-config="true">

<security:form-login/>

<security:logout/>

<security:intercept-url pattern="/expired.jsp" access="IS_AUTHENTICATED_ANONYMOUSLY"/>

<security:intercept-url pattern="/**" access="ROLE_USER"/>

<security:session-management>

<security:concurrency-control max-sessions="1" expired-url="/expired.jsp" />

</security:session-management>

</security:http>

session 恒定报复养护

session 恒定是指效劳器在给存户端创造 session 后,在该 session 过时之前,它们都将经过该 session 举行通讯。session 恒定报复是指歹意报复者先经过考察运用来创造一个 session,而后再让其余用户运用沟通的 session 举行登录(比方经过发送一个包括该 sessionId 参数的链接),待其余用户胜利登录后,报复者运用从来的 sessionId 考察体例将和原用户赢得同样的权力。Spring Security 默许是对 session 恒定报复采用了养护办法的,它会在用户登录的功夫从新为其天生一个新的 session。即使你的运用不须要这种养护大概该养护办法与你的某些需要相辩论,你不妨经过 session-management 的 session-fixation-protection 属性来变换其养护战略。该属性的可选值犹如下三个。

migrateSession:这是默许值。其表白在用户登录后将兴建一个 session,同声将原 session 中的 attribute 都 copy 到新的 session 中。

none:表白连接运用从来的 session。

newSession:表白从新创造一个新的 session,然而不 copy 原 session 具有的 attribute。

分享到 :
相关推荐

Leave a Reply

Your email address will not be published. Required fields are marked *