前言
这个系列设计到的技术点如下:
- 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规则。规则如下:
- ? : 匹配一个字符
- * :匹配 0 个或多个字符
- ** :匹配 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");
}