Spring Security中可以通过Authentication(认证)和Authorization(授权)的功能,识别用户身份并完成用户授权。
通常的做法是在用户访问某些资源时,通过拦截器方法确认用户身份,如果当前用户身份不明(未登录或者是匿名用户)且被访问资源是非公开资源时,系统会强制跳转至登录页面,在用户登录完成后再跳转回原地址,继续访问资源。
这些拦截功能基本都是使用Filter
在请求未到达DispatcherServlet
前就完成处理了。但如果我们需要在细粒度上进行访问权限控制的话,那该怎么办呢?
比如我们想要在某个@Service
类的某些方法上增加权限校验,只有具有特定角色的用户才能访问这些资源,这种场景该如何实现呢?
Spring Security通过使用MethodSecurityInterceptor
实现了上述场景下的权限管理,本文将介绍具体该如何实现。
内部机制和原理参看Spring Security Reference中的Method Security章节
搭建应用
首先我们引入相关依赖,主要是spring-boot-starter-web
和spring-boot-starter-security
。
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0modelVersion>
<groupId>org.examplegroupId>
<artifactId>SpringSecurityartifactId>
<version>1.0-SNAPSHOTversion>
<parent>
<groupId>org.springframework.bootgroupId>
<artifactId>spring-boot-starter-parentartifactId>
<version>2.3.3.RELEASEversion>
parent>
<dependencies>
<dependency>
<groupId>org.springframework.bootgroupId>
<artifactId>spring-boot-starter-webartifactId>
dependency>
<dependency>
<groupId>org.springframework.bootgroupId>
<artifactId>spring-boot-starter-securityartifactId>
dependency>
dependencies>
project>
在工程中创建org.example.security包,在这个包下面新建一个Application
类,作为应用的启动类。
增加Spring Boot应用标准启动代码:
package org.example.security;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
@SpringBootApplication(proxyBeanMethods = false)
public class Application {
public static void main(String[] args) {
SpringApplication.run(Application.class);
}
}
增加Spring Security相关配置
首先我们定义一个UserDetailsService
类型的Bean对象。Spring Security在用户登录时,使用该对象校验用户身份