spring-security login?logout 重定向到登录

Posted

技术标签:

【中文标题】spring-security login?logout 重定向到登录【英文标题】:spring-security login?logout redirects to login 【发布时间】:2013-12-30 05:29:27 【问题描述】:

我正在使用带有 java 配置和两个 HttpSecurity 配置的 spring-security 3.2.0.RC2。一个用于 REST API,一个用于 UI。 当我发布到 /logout 时,它会重定向到 /login?logout,但随后(错误地)重定向到 /login。 当我成功输入用户名和密码时,我被重定向到登录?注销并且必须再次输入凭据才能进入主页。 所以登录的 permitAll 似乎没有被登录?注销。

我的安全配置如下所示:

@Configuration
@EnableWebSecurity
public class SecurityConfig extends WebSecurityConfigurerAdapter 

@Resource
private MyUserDetailsService userDetailsService;

@Autowired
public void configureGlobal(AuthenticationManagerBuilder auth)
        throws Exception 
    StandardPasswordEncoder encoder = new StandardPasswordEncoder(); 
    auth.userDetailsService(userDetailsService).passwordEncoder(encoder);


@Configuration
@Order(1)
public static class RestSecurityConfig
        extends WebSecurityConfigurerAdapter 

    @Override
    protected void configure(HttpSecurity http) throws Exception 
        http
            .antMatcher("/v1/**").authorizeRequests()
                .antMatchers("/v1/admin/**").hasRole("admin")
                .antMatchers("/v1/account/**").hasRole("admin")
                .antMatchers("/v1/plant/**").access("hasRole('admin') or hasRole('dataProvider')")
                .antMatchers("/v1/upload/**").access("hasRole('admin') or hasRole('dataProvider')")
                .antMatchers("/v1/**").authenticated()
            .and().httpBasic();
    


@Configuration
@Order(2)
public static class UiSecurityConfig extends WebSecurityConfigurerAdapter 

    @Override
    public void configure(WebSecurity web) throws Exception 
       web.ignoring().antMatchers("/resources/**");
    

    @Override
    protected void configure(HttpSecurity http) throws Exception 
        http
            .authorizeRequests()
                .antMatchers("/account/**").hasRole("admin")
                .antMatchers("/admin/**").hasRole("admin")
                .antMatchers("/plant/**").access("hasRole('admin') or hasRole('dataProvider')")
                .antMatchers("/upload/**").access("hasRole('admin') or hasRole('dataProvider')")
                .anyRequest().authenticated()
            .and().formLogin().loginPage("/login").permitAll();
    




谁能解释为什么会发生这种情况或我的配置有什么问题?

我在此配置中看到的第二个问题是 jsp 标记 sec:authorize url=... 不起作用,尽管 sec:authorize access=... 确实有效。 在 url=... 情况下,即使用户未经授权,它也始终显示内容。 我知道用户没有被授权,因为点击应该被 sec:authorize 标签隐藏的链接会导致 403 Forbidden。

对此的任何帮助都非常感谢!

【问题讨论】:

【参考方案1】:

而不是这个:

.antMatchers("/login/**").permitAll()

我认为更好的解决方案是:

http
    .authorizeRequests()
        .antMatchers("/account/request/**").permitAll()
        .*antMatchers("/login").permitAll()
        .antMatchers("/account/change_password/**").authenticated()
        .antMatchers("/account/**").hasAuthority("admin")
        .antMatchers("/admin/**").hasAuthority("admin")
        .antMatchers("/plant/**").hasAnyAuthority("admin", "dataProvider")
        .antMatchers("/upload/**").hasAnyAuthority("admin", "dataProvider")
        .anyRequest().authenticated()
    .and().formLogin().loginPage("/login").permitAll().
    .and().logout().logoutSuccessUrl("/login?logout").permitAll();

原因是,与 "/login/**" 相比,permitAll() 的 url 模式在这种情况下范围有限

【讨论】:

【参考方案2】:

我找到了解决这个明显错误的方法。 我在 /login/** 上添加了 permitAll(),如下所示:

@Override
protected void configure(HttpSecurity http) throws Exception 
    http
        .authorizeRequests()
            .antMatchers("/account/request/**").permitAll()
            .antMatchers("/login/**").permitAll()
            .antMatchers("/account/change_password/**").authenticated()
            .antMatchers("/account/**").hasAuthority("admin")
            .antMatchers("/admin/**").hasAuthority("admin")
            .antMatchers("/plant/**").hasAnyAuthority("admin", "dataProvider")
            .antMatchers("/upload/**").hasAnyAuthority("admin", "dataProvider")
            .anyRequest().authenticated()
        .and().formLogin().loginPage("/login").permitAll();

回答我自己的问题,以防它帮助遇到此错误的其他人。

【讨论】:

这解决了我的问题 - 但我仍然不确定是什么导致重定向到登录?注销 - 我的代码中没有任何地方......这是弹簧安全的事情?? @wwarren 很高兴它有帮助。当 spring security 处理 logout ti 重定向到 login?logout 以显示带有“You ahve been logged out”的登录页面。消息。

以上是关于spring-security login?logout 重定向到登录的主要内容,如果未能解决你的问题,请参考以下文章

如何使用spring-security通过用户名和密码登录?

Spring-Security文档笔记之logout

spring-security安全认证模块之创建工程

登录后重定向到自定义网址

Spring Security:身份验证导致 HTTP 405“方法不允许”

Log in 与 Sign in 有啥区别吗