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通过用户名和密码登录?