SecurityConfig 2针对不同角色的成功网址

时间:2015-07-20 19:07:44

标签: 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();
}
}

2 个答案:

答案 0 :(得分:7)

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

http
    .formLogin()
        .defaultSuccessUrl("/default")

现在创建一个处理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/";
    }
}

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

一些补充说明:

  • " /管理**"是重定向到defaultSuccessUrl的无效URL
  • 考虑通过formatting your code
  • 改进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();
     }
}

答案 1 :(得分:0)

这对我有用。

 @RequestMapping(value= {"/default"}, method = RequestMethod.GET)
    public String defaultAfterLogin() {
        Collection<? extends GrantedAuthority> authorities;
        Authentication auth = SecurityContextHolder.getContext().getAuthentication();
        authorities = auth.getAuthorities();
        String myRole = authorities.toArray()[0].toString();
        String admin = "admin";
        if (myRole.equals(admin)) {
            return "redirect:/admin/";
        }
        return "redirect:/r/";
    }