0

我真的不知道我是如何提出我的问题的。我开发了一个 Web 应用程序并使用了框架(Spring、SpringSecurity)

该应用程序工作正常,身份验证和管理角色和权限也是如此。

    <sec:http auto-config="true" use-expressions="true">

        <sec:intercept-url pattern="/pagess/admin/**" access="hasRole('ROLE_ADMIN')" />
        <sec:intercept-url pattern="/pagess/**" access="hasAnyRole('ROLE_USER','ROLE_ADMIN','ROLE_VISTEUR')" />
        <sec:form-login login-page="/login.jsf"
            authentication-failure-url="/loginFailed.jsf" default-target-url="/Menu.jsf" />
        <sec:logout logout-success-url="/login.jsf" delete-cookies="JSESSIONID"
            invalidate-session="true" />
        <sec:access-denied-handler error-page="/interdit.jsf"/>                                       
        <sec:session-management invalid-session-url="/login.jsf">
            <sec:concurrency-control max-sessions="1"
                error-if-maximum-exceeded="true" />
        </sec:session-management>
    </sec:http>

    <sec:authentication-manager alias="authenticationManager">
        <sec:authentication-provider>
            <sec:jdbc-user-service data-source-ref="DataSource"
                users-by-username-query="
              select username,password, enabled 
              from utilisateur where username=?"
                authorities-by-username-query="
              select username, authority from utilisateur 
              where username =?  " />

        </sec:authentication-provider>
    </sec:authentication-manager>
</beans:beans>

但就在今天,我注意到了一些奇怪的事情。当我在页面中时,我将之前的 google chrome 从应用程序中向上按到身份验证页面,。就在我以相反的方式拉开 Flech Advent 之后,它允许我进入应用程序,但没有身份验证是不正常的。

 <context-param>
  <param-name>contextConfigLocation</param-name>
      <param-value>
     /WEB-INF/application.xml
     /WEB-INF/spring_sec.xml
      </param-value>
   </context-param>
   <context-param>
        <param-name>javax.faces.PROJECT_STAGE</param-name>
        <param-value>Development</param-value>
    </context-param>
 <listener>
  <listener-class>
   org.springframework.web.context.ContextLoaderListener
  </listener-class>
   </listener>

   <filter>
        <filter-name>springSecurityFilterChain</filter-name>
        <filter-class>
            org.springframework.web.filter.DelegatingFilterProxy
        </filter-class>
    </filter>

    <filter-mapping>
        <filter-name>springSecurityFilterChain</filter-name>
        <url-pattern>/*</url-pattern>
    <dispatcher>FORWARD</dispatcher>
    <dispatcher>REQUEST</dispatcher>
    </filter-mapping>

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

   <listener>
  <listener-class>
   org.springframework.web.context.request.RequestContextListener
  </listener-class>
   </listener>

我该怎么办。提前谢谢你

4

2 回答 2

0

嗯。您所描述的听起来像是标准行为。登录到 Web 应用程序后,会创建一个带有安全上下文的会话,并且用户从那里开始被视为已通过身份验证。离开浏览器缓存中的网站的简单导航不会使会话无效。因为这很不方便,并且需要用户在每次导航到新站点时都登录。这就是网络应用程序应该如何表现的!

要注销用户,您必须使用j_spring_security_logout、使会话无效、删除安全上下文中的身份验证或使会话超时。在简单的浏览器导航的情况下,这些似乎都不可行。

但是,要实现没有会话的应用程序,您必须将会话超时设置为非常低的间隔,或者在加载页面后直接删除身份验证对象。这通常不是一种非常用户友好的方法。为了获得更好的答案,您可能需要详细说明问题(到目前为止这还不是真正的问题),详细说明应用程序应该完成的具体工作。

于 2013-05-27T17:08:20.973 回答
0

代替

<sec:logout logout-success-url="/login.jsf" delete-cookies="JSESSIONID"
        invalidate-session="true" />

经过

<sec:logout logout-url="/login.jsf" logout-success-url="/login.jsf" delete-cookies="JSESSIONID"
        invalidate-session="true" />

但我不确定是否将/login.jsf用于登录,同时注销是否有效。

您可能希望使用/logout.jsflogout-url您不需要创建 logunt.jsf,用户将能够使用注销/logout.jsf

于 2013-05-27T17:33:21.047 回答