请求授权(Authorize Requests)

我们的案例目前使用的是WebSecurityConfigurerAdapter中默认的HttpSecurity对象的配置,该配置是要求应用中所有url的访问都需要进行验证。我们也可以自定义哪些URL需要权限验证,哪些不需要。只需要在我们的SecurityConfig类中覆写configure(HttpSecurity http)方法即可。

 
 
  1. protected void configure(HttpSecurity http ) throws Exception {
  2.              http
  3.                   .authorizeRequests()            1                                                   
  4.                         .antMatchers( "/resources/**", "/signup" , "/about").permitAll()  2
  5.                         .antMatchers( "/admin/**").hasRole("ADMIN" )                    3    
  6.                         .antMatchers( "/db/**").access("hasRole('ADMIN') and hasRole('DBA')")  4
  7.                         .anyRequest().authenticated()        5
  8.                                          
  9.                         .and()
  10.                    // ...
  11.                   .formLogin();
  12.       }

1、http.authorizeRequests()方法有很多子方法,每个子匹配器将会按照声明的顺序起作用。

2、指定用户可以访问的多个url模式。特别的,任何用户可以访问以"/resources"开头的url资源,或者等于"/signup"或about

3、任何以"/admin"开头的请求限制用户具有 "ROLE_ADMIN"角色。你可能已经注意的,尽管我们调用的hasRole方法,但是不用传入"ROLE_"前缀

4、任何以"/db"开头的请求同时要求用户具有"ROLE_ADMIN"和"ROLE_DBA"角色。

5、任何没有匹配上的其他的url请求,只需要用户被验证。


源码解读

在这个案例中我们调用了antMatchers方法来定义什么样的请求可以放过,什么样的请求需要验证。antMatchers使用的是Ant风格的路径匹配模式(在下一节我们会详细讲解)。这个方法中定以在AbstractRequestMatcherRegistry中,我们查看一下这个方法的源码:

 
 
  1. public C antMatchers(String... antPatterns) {
  2.    return chainRequestMatchers(RequestMatchers.antMatchers(antPatterns));
  3. }

这个方法内部又调用了RequestMatchers对象的静态方法antMatchers方法,源码如下

 
 
  1. public static List<RequestMatcher> antMatchers(HttpMethod httpMethod,
  2.       String... antPatterns) {
  3.    String method = httpMethod == null ? null : httpMethod.toString();
  4.    List<RequestMatcher> matchers = new ArrayList<RequestMatcher>();
  5.    for (String pattern : antPatterns) {
  6.       matchers.add(new AntPathRequestMatcher(pattern, method));
  7.    }
  8.    return matchers;
  9. }

可见最终返回的是一个RequestMatcher列表,事实上,SpringSecurity在工作过程中,就可以利用RequestMatcher对象来进行路径匹配了。

除了ANT风格的路径匹配模式,我们还可以使用基于正则表达式的路径匹配模式,对应的方法是regexMatchers(..)。

  • 10
    点赞
  • 24
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值