访问控制构成:
url匹配规则 + 权限控制方法
url匹配规则:
1、anyRequest:匹配所有请求
2、antMatchers:
? :匹配一个字符
* : 匹配0或者多个字符
**:匹配0个或者多个目录
如释放静态资源:
.antMatchers(
HttpMethod.GET,
"/*.html",
"/**/*.html",
"/**/*.css",
"/**/*.js"
).permitAll()
3、正则表达式
权限控制方式:
1、内置的权限控制方式
anonymous() 允许匿名用户访问,不允许已登入用户访问
permitAll() 不管登入,不登入 都能访问 permitAll()
access: access表达式
fullyAuthenticated 和rememberMe相对:
rememberMe记住我的功能就能访问,fullyAuthenticated必须重新登录才行。
2、access 表达式,自定义权限控制
1)、写一个service 类
@Service
public class MyAuthService {
public boolean hasPermission(HttpServletRequest request, Authentication authentication){
System.out.println("经过了权限控制!");
Object principal = authentication.getPrincipal();
if(principal instanceof UserDetails){
System.out.println(((UserDetails)principal).getUsername());
}
return true;
}
}
2)、配置类:
即可。
也就是说 access 可以调用你指定的方法 并且参数从WebSecurityExpressionRoot中去获取,然后传递给方法,这个方法返回true或者false,从而判断是否有权限。
3、基于注解的访问控制
1)、开启
@EnableGlobalMethodSecurity(prePostEnabled = true, securedEnabled = true)
一般开启 调用方法前执行校验权限,securedEnabled开启角色判断
2)、在指定的方法上加
@Secured(ROLE_**) :必须要以ROLE_开头
@PreAuthorize("hasRole('abc')") : 注解里面就是access 表达式。
当然也通过上面access自定义权限控制!!!!
@PreAuthorize("@myAuthService.hasPermission(denyAll,authentication)")
从而实现自定义的权限控制。