SecurityConfig 2针对不同角色的成功URL

D4N*_*3LS 2 java spring spring-mvc spring-security

我正在尝试使用Spring Security,所有人都使用一个角色.

我想根据ROLE重定向到2个不同的站点,但框架总是重定向到最后一个defaultSuccessUrl("/ ... ")**.这有可能吗?

@Configuration
@EnableWebSecurity
public class SecurityConfig extends WebSecurityConfigurerAdapter {
@Autowired
public void configureGlobal(AuthenticationManagerBuilder auth)
        throws Exception {
    auth.inMemoryAuthentication().withUser("admin").password("admin").roles("ADMIN")
            .and().withUser("user").password("user").roles("USER");
}

@Override
protected void configure(HttpSecurity http) throws Exception {
    http.authorizeRequests().antMatchers("/admin/**")
            .access("hasRole('ROLE_ADMIN')").and().formLogin()
            .defaultSuccessUrl("/admin**").loginPage("/")
            .failureUrl("/").usernameParameter("username")
            .passwordParameter("password").and().logout()
            .logoutSuccessUrl("/").and()
            .authorizeRequests().antMatchers("/user/**")
            .access("hasRole('ROLE_USER')").and().formLogin()
            .defaultSuccessUrl("/user**").loginPage("/")
            .failureUrl("/").usernameParameter("username")
            .passwordParameter("password").and().logout()
            .logoutSuccessUrl("/");
    http.csrf().disable();
}
}
Run Code Online (Sandbox Code Playgroud)

Rob*_*nch 7

执行此操作的最佳方法是将用户发送到URL,然后创建一个处理default-target-url的控制器.例如,以下内容将用户发送到/ default:

http
    .formLogin()
        .defaultSuccessUrl("/default")
Run Code Online (Sandbox Code Playgroud)

现在创建一个处理URL"/ default"的控制器.控制器应根据滚动重定向或转发.下面是使用Spring MVC的示例,但任何类型的控制器都可以工作(即Struts,Servlet等).

@Controller
public class DefaultController {
    @RequestMapping("/default")
    public String defaultAfterLogin(HttpServletRequest request) {
        if (request.isUserInRole("ROLE_ADMIN")) {
            return "redirect:/admin/";
        }
        return "redirect:/user/";
    }
}
Run Code Online (Sandbox Code Playgroud)

这种方法的优点是它没有与任何特定的Security实现相结合,它没有耦合到任何特定的MVC实现,并且它可以轻松地与XML和Java配置方法一起使用.

一些额外的说明:

  • "/ admin**"是重定向到defaultSuccessUrl的无效URL
  • 考虑通过格式化代码来改进Java配置可读性
  • 由于默认设置,您有不必要的配置.

以下是您的代码的清理版本:

@Configuration
@EnableWebSecurity
public class SecurityConfig extends WebSecurityConfigurerAdapter {
    @Autowired
    public void configureGlobal(AuthenticationManagerBuilder auth)
        throws Exception {
        auth
           .inMemoryAuthentication()
               .withUser("admin")
                   .password("admin")
                   .roles("ADMIN")
                   .and()
               .withUser("user")
                   .password("user")
                   .roles("USER");
    }

    @Override
    protected void configure(HttpSecurity http) throws Exception {
        http
            .authorizeRequests()
                .antMatchers("/admin/**").hasRole("ADMIN")
                .antMatchers("/user/**").hasRole("USER")
                .and()
             .formLogin()
                .defaultSuccessUrl("/default")
                .loginPage("/")
                .failureUrl("/")
                .and()
            .logout()
                .logoutSuccessUrl("/")
                .and()
            // It is generally BAD to disable CSRF protection!
            .csrf().disable();
     }
}
Run Code Online (Sandbox Code Playgroud)