2.6.6 anyRequest()
在之前认证过程中我们就已经使用过anyRequest(),表示匹配所有的请求,一般情况下此方法都会使用,设置全部内容都需要进行认证。
.anyRequest().authenticatied();
2.6.7 antMatcher()
方法定义如下:
public C antMatcher(String… antPatterns)
参数是不定向参数,每一个参数是有一个ant表达式,用于匹配url规则
规则如下:
- ? 匹配一个字符
- *匹配0个或多个字符
- **匹配0个或多个目录
在实际项目中经常需要放行所有的静态资源,下面演示放行js文件夹下所有的脚本文件
.antMatchers("/js/**", "/css/**").permitAll();
还有一种配置方式是只要是js文件就放行
.antMatchers("/**/*.js").permitAll();
2.6.8 regexMatcher()
.regexMatchers(".+[.]png").permitAll(); 正则表达式 放行 所有的png图片
.regexMatchers(HttpMethed.POST, ...regexPatterns:"/demo").permitAll() //指定请求方法
2.6.9 mvcMatchers 详解
如果我们想让整个项目访问地址前都加上/xxxx
我们需要从application.properties里面加上 spring.mvc.servlet.path=/xxxx
现在有了mvcMatchers方法后我们可以这样写
.mvcMatchers(...patterns:"/demo").servletPath("/xxxx").permitAll()
2.7 内置控制方法
2.7.1
permitAll 允许所有的访问
denyAll 禁止所有的访问
anonymous 匿名访问
authenticated 认证之后可以访问 只要登录进来就能访问
fullyAuthenticated 必须用户名和密码登录之后才能访问
rememberMe 在免登陆下进行访问
2.8 角色权限判断
除了之前讲解的内置权限控制。Spring Security中还支持很多其他权限控制。这些方法一般都用于用户已经被认证后,判断用户是否具有特定的要求。
基于权限
2.8.1 hasAuthority(String)
判断用户是否具有特定的权限,用户的权限是在自定义登录逻辑中创建User对象时指定的。下图中admin和normal就是用户的权限。admin 和 normal 严格区分大小写。
在配置类中通过hasAuthority(“admin”)设置具有admin权限时才能访问
.antMatchers("/main.html").hasAuthority("admin")
2.8.2 hasAnyAuthority(String …)
如果用户具备给定权限中的某一个,就允许访问
基于角色
2.8.3 hasRole(String)
判断用户是否具有特定的角色,用户的角色是在自定义登录逻辑中创建User对象时指定的。下图中"ROLE_abc"就是用户的角色,角色的添加ROLE_是必须要有的,ROLE_abc就代表abc是角色
在配置类中通过hasRole(“abc”)设置具有abc角色时才能访问
.antMatchers("/main.html").hasRole("abc")
2.8.4 hasAnyRole(String…)
如果用户具备给定角色中的某一个,就允许访问
基于IP地址
2.8.5 hasIpAddress(String)
在配置类中通过hasIpAddress(“192.168.50.1”)设置192.168.50.1的服务器才能访问
.antMatchers("/main.html").hasIpAddress("192.168.50.1")
2.9 自定义403处理方法
自定义MyAccessDeniedHandler类
@Component
public class MyAccessDeniedHandler implements AccessDeniedHandler {
@Override
public void handle(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, AccessDeniedException e) throws IOException, ServletException {
//响应状态
httpServletResponse.setStatus(HttpServletResponse.SC_FORBIDDEN);
//返回json格式
httpServletResponse.setHeader("Content-Type","application/json;charset=utf-8");
PrintWriter writer = httpServletResponse.getWriter();
writer.write("{\"status\":\"error\",\"msg\":\"权限不足请联系管理员!\"}");
writer.flush();
writer.close();
}
}
在配置类中加入:
吗 @Autowired
private MyAccessDeniedHandler accessDeniedHandler;
//异常处理
http.exceptionHandling().accessDeniedHandler(accessDeniedHandler);
2.10 基于表达式的访问控制
可以通过access方法实现上面访问控制一样的功能
.antMatches("/main.html").access("hasRole('abc')")
等价于
.antMatchers("/main.html").hasRole("abc")
2.11基于注解的访问控制
在Spring Security中提供了一些访问控制的注解,这些注解都是默认是都不可用的,需要通过@EnableGlobalMethodSecuriy进行开启后使用。
如果设置的条件允许, 程序可以正常运行。如果不允许会报500
org.soringfreamework.security.access.AccessDeniedException:不允许访问
这些注解可以写到Service接口或方法上,也可以写到Controller或Controller的方法上,通常情况下都写在控制器方法上,控制接口URL是否允许被访问。
2.11.1 @Secured
@Secured是专门用于判断是否具有角色的,都写在方法或类上,参数要以ROLE_开头
PreAuthorize允许角色以ROLE_开头,也可以不以ROLE_开头,但是配置类不允许以ROLE_开头