spring boot 登录重定向外部地址,出现跨域问题 怎么办?
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了spring boot 登录重定向外部地址,出现跨域问题 怎么办?相关的知识,希望对你有一定的参考价值。
参考技术A 在外部系统那里处理增加跨域配置Spring Boot WebSecurityConfigurerAdapter 登录重定向
【中文标题】Spring Boot WebSecurityConfigurerAdapter 登录重定向【英文标题】:Spring Boot WebSecurityConfigurerAdapter Login Redirect 【发布时间】:2018-04-26 13:58:38 【问题描述】:我在 Spring Boot 应用程序中使用以下 WebSecurityConfigurerAdapter 代码:
@Override
protected void configure(HttpSecurity http) throws Exception
http
.authorizeRequests()
.antMatchers("/user/**").hasRole("USER").anyRequest().permitAll()
.antMatchers("/admin/**").hasRole("EADM").anyRequest().permitAll()
.and()
.formLogin()
.loginPage("/login")
.usernameParameter("personContactEmail").passwordParameter("personRegPwd")
.successHandler(secureAuthenticationSuccessHandler)
.and()
.logout()
.logoutRequestMatcher(new AntPathRequestMatcher("/logout"))
.logoutSuccessUrl("/")
.deleteCookies("JSESSIONID")
.invalidateHttpSession(true)
.and()
.exceptionHandling().accessDeniedHandler(accessDeniedHandler());
当我尝试访问 /user 页面而不进行身份验证时,应用会将我重定向到登录页面,但是当我尝试访问 /admin 页面而不进行身份验证时,应用会将我带到管理员主页?
我已经设置了一个自定义的 AuthenticationSuccessHandler。当我调试和调用 /user 页面时,它进入了这里,但是使用 /admin 它甚至没有达到这个方法。我不确定我在这里缺少什么?
protected String determineTargetUrl(Authentication authentication)
boolean isUser = false;
boolean isAdmin = false;
Collection<? extends GrantedAuthority> authorities = authentication.getAuthorities();
for (GrantedAuthority grantedAuthority : authorities)
if (grantedAuthority.getAuthority().equals("ROLE_USER"))
isUser = true;
break;
else if (grantedAuthority.getAuthority().equals("ROLE_EADM"))
isAdmin = true;
break;
if (isUser)
return "/user";
else if (isAdmin)
return "/admin";
else
throw new IllegalStateException();
有什么帮助吗?
【问题讨论】:
【参考方案1】:.authorizeRequests() .antMatchers("/user/**").hasRole("USER").anyRequest().permitAll() .antMatchers("/admin/**").hasRole("EADM").anyRequest().permitAll()
antMatchers() 和 anyRequest() 都创建RequestMatchers(分别为AntPathRequestMatcher 和AnyRequestMatcher)并返回一个RequestMatcherConfigurer。然后在处理请求时按顺序应用给定 RequestMatcherConfigurer 中的 RequestMatchers。第一个有效匹配用于确定用户是否能够访问该页面。因此,您的匹配器应从最具体到最不具体排序
.antMatchers("/user/**").hasRole("USER") 先处理,所以 /user/** 需要 ROLE_USER。 .anyRequest().permitAll() 是第二个,所以当一个对 /admin/** 的请求被处理时,这个请求将匹配 permitAll() 并且用户将被授予访问页面的权限并且 .antMatchers("/admin/**").hasRole("EADM") 永远不会被处理。
这应该通过删除第一个 .anyRequest().permitAll() 来解决。像这样:
...
http
.authorizeRequests()
.antMatchers("/user/**").hasRole("USER")
.antMatchers("/admin/**").hasRole("EADM")
.anyRequest().permitAll()
.and()
...
【讨论】:
以上是关于spring boot 登录重定向外部地址,出现跨域问题 怎么办?的主要内容,如果未能解决你的问题,请参考以下文章
Spring Boot 控制器跨 docker pod 重定向
Spring Boot WebSecurityConfigurerAdapter 登录重定向