小编典典

Spring Security中的多个antMatchers

spring-mvc

我在内容管理系统上工作,该系统具有五个 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),并且有两个登录页面,一个用于用户,另一个用于管理员。

该代码似乎可以正常工作,但管理部分除外-它不起作用,但返回拒绝访问异常。


阅读 3839

收藏
2020-06-01

共1个答案

小编典典

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

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

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

因此,登录页面的/admin/**规则应在规则之前。例如

.antMatchers("/admin/login").permitAll()
.antMatchers("/admin/**").hasRole("ADMIN")
2020-06-01