Spring安全性没有从页面中检测出用户

时间:2013-05-27 16:07:21

标签: java spring spring-security

我真的不知道我是怎么回事。 我开发了一个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>

但就在今天我发现了一些奇怪的事情。当我在页面中时,我将箭头以前的谷歌浏览器从应用程序中按到认证页面,。 就在我从相反的意义上拉开了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>
我可以做到。请提前告诉你

2 个答案:

答案 0 :(得分:0)

Mmmh。你所描述的听起来像标准行为。登录到Web应用程序后,将创建一个具有安全上下文的会话,并且用户从那里被视为已通过身份验证。在浏览器缓存中远离网站的简单导航不会使会话无效。因为它非常不方便并且需要用户登录到新站点的每个导航。所以这就是网络应用程序的表现方式!

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

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

答案 1 :(得分: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.jsf使用logout-url,您无需创建logount.jsf,用户也可以使用/logout.jsf

注销