目录
一.访问控制 url 匹配
anyRequest().authenticated();
比如咱们之前写的代码中,上半部分是认证(),下半部分是授权(url拦截那块)

参数是不定向参数,每个参数是一个 ant 表达式,用于匹配 URL规则。
- ? 匹配一个字符
- * 匹配 0 个或多个字符
- ** 匹配 0 个或多个目录
在resources/static下创建三个文件夹,并且在image下放一张图片
咱们现在通过设置来antMatcher()属性来放行静态资源
//放行静态资源文件夹(路径要具体情况具体分析)
.antMatchers("/css/**","/js/**","/image/**").permitAll()
/**的意思是当前目录下的所有文件或目录及其子目录
运行项目,访问localhost:8080/image/rb.jpg
咱们现在把刚刚配置的授权语句注释掉,再换一种思路来放行上面这张图片
//放行png图片
.antMatchers("/**/*.jpg").permitAll()
上面的/**意思就是不管前面有多少层目录,最后的一个*表示匹配所有后缀名是.jpg的图片,运行项目之后,仍访问成功。
一个常见问题,这个问题虽然我没遇到,但是还是要说一下,就是如果访问不到,除了重启服务器之外,也可以将target目录删除之后再启动项目。
3.regexMatchers()
.regexMatchers(".+[.]js").permitAll()
无论是 antMatchers()还是 regexMatchers()都具有两个参数的方法,其中第一个参数都是HttpMethod,表示请求方式,当设置了HttpMethod 后表示只有设定的特定的请求方式才执行对应的权限设置。
spring.mvc.servlet.path= /demo
这样配置之后,以访问上节课的用到的那个上上小节访问的那个热巴的图片为例:
注意左上角的访问地址,需要在原来的访问路径上加上demo
在配置文件中的配置了servletPath前缀的前提下,在配置类可以用下列两种路径放行方法。
在 Spring Security 的配置类中配置.servletPath()是 mvcMatchers() 返回值特有的方法antMatchers()和 regexMatchers()没有这个方法。 在 servletPath()中配置了 servletPath 后,mvcMatchers()直接写 SpringMVC 中@RequestMapping()中设置的路径即可。
//路径/demo/image/rb.jpg
.mvcMatchers("/image/rb.jpg").servletPath("/demo").permitAll()
.antMatchers("/demo/image/rb.jpg").permitAll()
配置的时候有个报错
英文的意思就是antMatchers应该写在anyRequest
二.内置访问控制方法介绍
三.角色权限判断
return new User(username,password, AuthorityUtils.commaSeparatedStringToAuthorityList("admin"));
在配置类中通过 hasAuthority(“admin”)设置具有 admin 权限时才能访问。
上面这句话的意思就是用户只有具有admin权限才有资格访问main1.html页面
.antMatchers("/main1.html").hasAuthority("admin")
修改main.html
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
<h2>main.html</h2>
<a href="/main1.html">跳转到main1.html</a>
</body>
</html>
然后再编写main1.html
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
<h2>main1.html</h2>
</body>
</html>
但是访问登录界面的时候却发现localhost:8080/login.html不好使了
是因为设置了servletPath的原因,于是我在表单认证和表单授权里都加了路径前缀/demo
先将配置文件中servletPath的配置去掉,方便后续操作
把登录成功之后的跳转页面切换一下
访问localhost:8080/login,输入正确的用户名和密码之后,出现如下界面
点击链接,因为我们已经配置了admin权限,所以可以成功跳转
.antMatchers("/main1.html").hasAnyAuthority("adMin","admiN")
用了上面的这句代码之后,就访问不到main1.html了因为admin不是adMin和asmiN的其中之一了

//定义角色
.antMatchers("main1.html").hasRole("abc")
4.hasAnyRole(String ...)
//定义角色
.antMatchers("main1.html").hasAnyRole("abc","Abc")
这和hasAnyAuthority一个意思,只不过一个是定义权限,一个是定义角色


当浏览器中通过具体 ip 进行访问时控制台打印内容: