我真的不知道我是怎么回事。 我开发了一个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>
我可以做到。请提前告诉你
答案 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