Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/spring/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Spring security logoutSuccessUrl登录?尽管登录页面允许所有用户登录,但注销似乎受到保护_Spring_Spring Security - Fatal编程技术网

Spring security logoutSuccessUrl登录?尽管登录页面允许所有用户登录,但注销似乎受到保护

Spring security logoutSuccessUrl登录?尽管登录页面允许所有用户登录,但注销似乎受到保护,spring,spring-security,Spring,Spring Security,我有下面的Spring安全设置。 请注意,成功注销会再次返回登录页面 http .csrf() .disable() .authorizeRequests() .antMatchers("/**").hasRole("USER") .and() .formLogin() .loginPage("/login") .fail

我有下面的Spring安全设置。 请注意,成功注销会再次返回登录页面

    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”)