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 登录重定向

spring boot 重定向到页面登录

登录后 Spring Boot 重定向到请求的 URL

成功登录后 Spring Boot Security 重定向 - 未定义

执行登录保存请求后,Spring Boot Security POST 重定向到登录页面