SpringSecurity学习记录3

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 严格区分大小写。

image-20201230082958007

在配置类中通过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是角色

image-20201230150926007

在配置类中通过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_开头

image-20210101085853162

image-20210101090020451

image-20210101090032549

image-20210101091031248

PreAuthorize允许角色以ROLE_开头,也可以不以ROLE_开头,但是配置类不允许以ROLE_开头

猜你喜欢

转载自blog.csdn.net/zhanduo0118/article/details/112093802