SpringSecurity+JWT项目实战之Java权限管理实战(三)--访问控制

前言

本文是参考尚学堂SpringSecurity精讲,仅作为学习记录使用。

这个系列设计到的技术点如下:

  • SpringSecurity
  • Oauth2
  • SpringSecurity + Oauth2
  • SpringSecurity +JWT
  • SpringSecurity + Oauth2
  • SpringSecurity + Oauth2 + JWT
背景

在前面讲解了认证中所有常用配置,主要是对 http.formLogin() 进行操作。而在配置类中http.authorizeRequests() 主要是对url进行控制,也就是我们所说的授权(访问控制)。http.authorizeRequests() 也支持连缀写法,总体公式为:url 匹配规则.权限控制方法
通过上面的公式可以有很多 url 匹配规则和很多权限控制方法。这些内容进行各种组合就形成了Spring Security中的授权。
在所有匹配规则中取所有规则的交集。配置顺序影响了之后授权效果,越是具体的应该放在前面,越是笼统的应该放到后面。

  • anyRequest()
    在之前认证过程中我们就已经使用过 anyRequest(),表示匹配所有的请求。一般情况下此方法都会使用,设置全部内容都需要进行认证。
.anyRequest().authenticated();  
  • antMatcher()
    方法定义如下
public C antMatchers(String... antPatterns)  

参数是可变参数,每个参数是一个 ant 表达式,用于匹配 URL规则。规则如下:

  1. ? : 匹配一个字符
  2. * :匹配 0 个或多个字符
  3. ** :匹配 0 个或多个目录
    在实际项目中经常需要放行所有静态资源,下面演示放行 js 文件夹下所有脚本文件。
.antMatchers("/js/**","/css/**").permitAll()  

还有一种配置方式是只要是.js 文件都放行

.antMatchers("/**/*.js").permitAll()
  • regexMatchers()
    使用正则表达式进行匹配。和 antMatchers() 主要的区别就是参数, antMatchers() 参数是 ant表达式, regexMatchers() 参数是正则表达式。
    如下表示所有以.js 结尾的文件都被放行。
.regexMatchers( ".+[.]js").permitAll()
  • 两种参数时使用方式
    无论是 antMatchers() 还是 regexMatchers() 都具有两个参数的方法,其中第一个参数都是HttpMethod ,表示请求方式,当设置了 HttpMethod 后表示只有设定的特定的请求方式才执行对应的权限设置。
    枚举类型 HttpMethod 内置属性如下:
//
// Source code recreated from a .class file by IntelliJ IDEA
// (powered by Fernflower decompiler)
//

package org.springframework.http;

import java.util.HashMap;
import java.util.Map;
import org.springframework.lang.Nullable;

public enum HttpMethod {
    GET,
    HEAD,
    POST,
    PUT,
    PATCH,
    DELETE,
    OPTIONS,
    TRACE;

    private static final Map<String, HttpMethod> mappings = new HashMap(16);

    private HttpMethod() {
    }

    @Nullable
    public static HttpMethod resolve(@Nullable String method) {
        return method != null ? (HttpMethod)mappings.get(method) : null;
    }

    public boolean matches(String method) {
        return this == resolve(method);
    }

    static {
        HttpMethod[] var0 = values();
        int var1 = var0.length;

        for(int var2 = 0; var2 < var1; ++var2) {
            HttpMethod httpMethod = var0[var2];
            mappings.put(httpMethod.name(), httpMethod);
        }

    }
}
  • mvcMatchers()
    mvcMatchers()适用于配置了 servletPath 的情况。servletPath 就是所有的 URL 的统一前缀。在 SpringBoot 整合SpringMVC 的项目中可以在
    application.properties 中添加下面内容设置 ServletPath
spring.mvc.servlet.path=/xxxx

在 Spring Security 的配置类中配置 .servletPath() 是 mvcMatchers()返回值特有的方法,antMatchers()和 regexMatchers()没有这个方法。在 servletPath() 中配置了 servletPath 后,mvcMatchers()直接写 SpringMVC 中@RequestMapping()中设置的路径即可。

.mvcMatchers("/demo").servletPath("/xxxx").permitAll()

如果不习惯使用 mvcMatchers()也可以使用 antMatchers(),下面代码和上面代码是等效

.antMatchers("/xxxx/demo").permitAll()
内置访问控制方法

Spring Security 匹配了 URL 后调用了 permitAll() 表示不需要认证,随意访问。在 Spring Security中提供了多种内置控制。

  • permitAll()
  • permitAll()表示所匹配的 URL 任何人都允许访问。
    在这里插入图片描述
  • authenticated()
    authenticated()表示所匹配的 URL 都需要被认证才能访问。
    在这里插入图片描述
  • anonymous()
    anonymous()表示可以匿名访问匹配的URL。和permitAll()效果类似,只是设置为 anonymous()的 url会执行 filter 链中
public ExpressionUrlAuthorizationConfigurer<H>.ExpressionInterceptUrlRegistry anonymous() {
            return this.access("anonymous");
        }
  • denyAll()
    denyAll()表示所匹配的 URL 都不允许被访问。
        public ExpressionUrlAuthorizationConfigurer<H>.ExpressionInterceptUrlRegistry denyAll() {
            return this.access("denyAll");
        }
  • rememberMe()
  • 被“remember me”的用户允许访问
public ExpressionUrlAuthorizationConfigurer<H>.ExpressionInterceptUrlRegistry rememberMe() {
            return this.access("rememberMe");
        }
  • fullyAuthenticated()
    如果用户不是被 remember me 的,才可以访问。
        public ExpressionUrlAuthorizationConfigurer<H>.ExpressionInterceptUrlRegistry fullyAuthenticated() {
            return this.access("fullyAuthenticated");
        }
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值