Java Spring security未检测到页面中的用户数量不足
我真的不知道我怎么会有这个问题。 我开发了一个web应用程序,并使用了框架(Spring、SpringSecurity) 应用程序工作正常,身份验证和管理角色以及权限也正常Java Spring security未检测到页面中的用户数量不足,java,spring,spring-security,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: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>
但就在今天,我注意到了一些奇怪的事情。当我在页面中时,我按下上一个GoogleChrome上的箭头,从应用程序进入认证页面,。
就在我从相反的意义上拉动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>
上下文配置位置
/WEB-INF/application.xml
/WEB-INF/spring_sec.xml
javax.faces.PROJECT_阶段
发展
org.springframework.web.context.ContextLoaderListener
springSecurityFilterChain
org.springframework.web.filter.DelegatingFilterProxy
springSecurityFilterChain
/*
向前地
要求
org.springframework.security.web.session.HttpSessionEventPublisher
org.springframework.web.context.request.RequestContextListener
我能做什么呢。提前谢谢你。你所描述的听起来像是标准行为。登录到web应用程序后,将创建一个具有安全上下文的会话,用户从此被视为已验证。在浏览器缓存中从网站进行简单导航不会使会话无效。因为这将非常不方便,并且需要用户登录到新站点的每个导航。这就是web应用程序的行为方式 要注销用户,您必须使用
j_-spring\u-security\u-logout
、使会话无效、删除安全上下文中的身份验证或暂停会话。对于简单的浏览器导航来说,这一切似乎都不可行
但是,要实现没有会话的应用程序,您必须将会话超时设置为非常低的间隔,或者在加载页面后直接删除身份验证对象。这通常不是一个非常用户友好的方法。为了得到更好的答案,你可能需要对这个问题(到目前为止还不是一个真正的问题)做更多的阐述,详细说明这个应用程序应该完成什么任务。
<sec:logout logout-success-url="/login.jsf" delete-cookies="JSESSIONID"
invalidate-session="true" />
借
但我不确定是否将/login.jsf用于登录,同时注销也会起作用
您可能需要使用
/logout.jsf
来获取注销url
,您不需要创建logunt.jsf,用户可以使用/logout.jsf
注销,只是为了澄清问题:您已经验证了自己的身份。然后使用浏览器导航返回到上一页。然后回到需要身份验证的页面,你仍然可以登录。是这样吗?你到底想让它做什么?是的,这是我的问题,他通过登录页面时没有填写用户名和密码。这可能会解决手头的实际“问题”。但是,如果用户只是导航到其他地方,然后返回到web应用程序,而不是返回,会发生什么呢?据我所知,与其说是以计划的方式让用户注销,不如说是在用户离开网页后保持登录。毕竟,阿德里亚诺表示,到目前为止,spring安全机制运行良好。spring安全机制运行良好。您可以在web.xml中设置会话空闲时间,这意味着如果在该时间内有大量的不活动,用户会话将无效。现在,当用户访问任何页面时,如果他作为有效会话(和正确的会话),他将获得该页面,如果他没有会话,他将被重定向到登录页面。如果返回的url指向登录页面,并且他已经有一个会话,他将被重定向到默认目标url中定义的默认url,即Menu.jsf抱歉延迟,我非常感谢您的帮助箱you@Carsten为您提供的帮助。这是我的logoutMethod public String dologout()抛出IOException{FacesContext.getCurrentInstance().getExternalContext().invalidateSession();this.username=“”;this.password=“”;ExternalContext context=FacesContext.getCurrentInstance().getExternalContext();context.redirect(context.getRequestContextPath()+“/j_spring\u security\u logout”);FacesContext.getCurrentInstance().responseComplete();返回null;}但同样在注销后,当我使用上一个按钮返回google chrome时,它允许我访问应用程序。这没有问题,您的应用程序对此也无能为力,因为当您使用浏览器导航时,会使用显示页面的本地缓存实例,而不会向您的服务器发送任何请求。但是此页面上的ion应该会触发未验证的异常或类似情况。这没有问题。(您在缓存页面上尝试过任何操作吗?发生了什么?)
<sec:logout logout-url="/login.jsf" logout-success-url="/login.jsf" delete-cookies="JSESSIONID"
invalidate-session="true" />