Spring安全中的多个antMatchers

时间:2015-06-13 13:42:04

标签: spring spring-mvc spring-security

我从事内容管理系统,有五个 antMatchers ,如下所示:

http.authorizeRequests()
        .antMatchers("/", "/*.html").permitAll()
        .antMatchers("/user/**").hasRole("USER")
        .antMatchers("/admin/**").hasRole("ADMIN")
        .antMatchers("/admin/login").permitAll()
        .antMatchers("/user/login").permitAll()
        .anyRequest().authenticated()
        .and()
        .csrf().disable();

这意味着访问者可以在根路径(/ *)上看到所有站点,用户只能看到(/ user),admin只能看到(/ admin),并且有两个用户登录页面另一个是管理员。

代码似乎工作正常,除了管理部分 - 它没有工作但返回访问被拒绝的异常。

1 个答案:

答案 0 :(得分:59)

我认为问题出在规则的顺序中:

.antMatchers("/admin/**").hasRole("ADMIN")
.antMatchers("/admin/login").permitAll()

规则的顺序很重要,更具体的规则应该先行。现在,以/admin开头的所有内容都需要具有ADMIN角色的经过身份验证的用户,甚至是/admin/login路径(因为/admin/login已经与/admin/**规则匹配,因此第二个规则是忽略)。

因此,登录页面的规则应该在/admin/**规则之前。 E.G。

.antMatchers("/admin/login").permitAll()
.antMatchers("/admin/**").hasRole("ADMIN")