Spring security logoutSuccessUrl登录?尽管登录页面允许所有用户登录,但注销似乎受到保护
我有下面的Spring安全设置。 请注意,成功注销会再次返回登录页面Spring security logoutSuccessUrl登录?尽管登录页面允许所有用户登录,但注销似乎受到保护,spring,spring-security,Spring,Spring Security,我有下面的Spring安全设置。 请注意,成功注销会再次返回登录页面 http .csrf() .disable() .authorizeRequests() .antMatchers("/**").hasRole("USER") .and() .formLogin() .loginPage("/login") .fail
http
.csrf()
.disable()
.authorizeRequests()
.antMatchers("/**").hasRole("USER")
.and()
.formLogin()
.loginPage("/login")
.failureUrl("/login?error")
.defaultSuccessUrl("/")
.permitAll()
.and()
.logout()
.logoutUrl("/logout")
.logoutSuccessUrl("/login?logout")
我可以使用此设置登录和注销。
但是,注销以/login而不是/login?注销结束
当我再次登录时,它会转到/login?logout
因此,/login?注销似乎受到保护。。。。尽管登录页面允许所有用户登录
有什么办法解决这个问题吗
编辑
正如Bart所建议的,我尝试添加一个AntMatcher用于登录?注销,如:
http
.csrf()
.disable()
.authorizeRequests()
.antMatchers("/ogin?logout").permitAll()
.antMatchers("/app/**").hasRole("USER")
.antMatchers("/login?logout").permitAll()
.and()
.formLogin()
.loginPage("/app/login")
.failureUrl("/app/login?error")
.defaultSuccessUrl("/app")
.permitAll()
.and()
.logout()
.logoutUrl("/app/logout")
.logoutSuccessUrl("/app/login?logout")
但它给出了同样的行为。注意:我试图在保护所有/**源之前和之后添加它。看起来URL
/login?logout
确实受到了保护。Spring Security会将请求保存到/login?logout
,并将您发送到登录页面。登录后,它会将您发送回保存的请求
添加规则应授予对注销目标页面的访问权
http.antMatchers(“/login?logout”).permitAll()代码>遇到了同样的问题,现在使用以下代码对我有效:
http.logout().logoutSuccessUrl("/login?logout").permitAll();
(即添加.permitAll()
是关键部分)配置中的此代码仅允许“用户”使用,并且/app/*
下的所有uri都有相同的要求
.antMatchers("/app/**").hasRole("USER")
但是您的注销uri是
.logoutSuccessUrl("/app/login?logout")
基于Spring的安全工作。这就是您无法访问注销uri的原因。我正在处理相同的问题。我进一步发现,/login?注销
会触发重定向到/login
,/login?错误
这有点奇怪
通过在浏览器中手动输入URL,您可以轻松地进行此操作。使用不同于error
的URL参数的调用都将导致重定向到/login
,并且参数error
是唯一的例外(导致/login?error
)
我的解决方案是,我只需将/login
从受保护区域移动
例如,代替:
http.antMatcher("/user/**")
.authorizeRequests().anyRequest().hasRole("USER")
.and()
.formLogin()
.loginPage("/user/login")
.authenticationDetailsSource(authenticationDetailsSource())
.successHandler(authenticationSuccessHandler())
.permitAll()
.and()
.logout()
.logoutUrl("/user/logout")
.logoutSuccessHandler(logoutSuccessHandler())
.and()
.exceptionHandling().accessDeniedHandler(accessDeniedHandler());
我现在使用:
http.antMatcher("/user/**")
.authorizeRequests().anyRequest().hasRole("USER")
.and()
.formLogin()
.loginPage("/userlogin")
.authenticationDetailsSource(authenticationDetailsSource())
.successHandler(authenticationSuccessHandler())
.permitAll()
.and()
.logout()
.logoutUrl("/user/logout")
.logoutSuccessHandler(logoutSuccessHandler())
.and()
.exceptionHandling().accessDeniedHandler(accessDeniedHandler());
我知道这类问题会给人留下一个很大的问号,并且会通过思考为什么?
尽管此线程建议了可能的解决方法。但不是正确的解决方案和理由。因为建议的解决方案无法显示注销成功/会话过期消息。因为这个帖子已经5年了,没有解决方案,所以我不得不在这里写下答案
因此,解决方案将是。
http
.csrf()
.disable()
.授权请求()
.antMatchers(“/login”).permitAll()//解决方案
.antMatchers(“/**”).hasRole(“用户”)
.及()
.formLogin()
.login页面(“/login”)
.failureUrl(“/login?错误”)
.defaultSuccessUrl(“/”)
.permitAll()
.及()
.logout()
.logoutUrl(“/logout”)
.logout成功URL(“/login?logout”);
想知道原因吗?
以前的配置
您的资源/login
是受限资源,只有在
authenticated=true
和hasRole=“User”
无论何时注销(或者如果您在注销成功处理程序中使用,您都会使会话无效并重定向)到/login?注销
页面,但/login
是受限资源,因此过滤器安全Interceptor
将重定向到配置的登录页面.login页面(“/login”)
。因此,您将不会收到传入查询字符串的任何参数,并且不会显示注销成功消息
spring security配置为在会话过期时存储以前访问的资源,登录后它将重定向到以前尝试的页面,即/login?logout
,登录后将再次注销
因此,解决方案将始终使登录页面成为不受限制的资源。感谢您的帮助。我累了,但表现出同样的行为;我编辑了原始问题。我同意您的解决方法.loginPage(“/userlogin”)
它有效,因为您有.antMatchers(“/user/**”).hasRole(“user”)
它不适用于.antMatchers(“/**”).hasRole(“user”)
。