FilterInvocationSecurityMetadataSource 接口是 Spring Security 中的核心接口之一,用于获取指定请求所需的访问控制元数据,包括访问所需的权限、角色等信息。该接口定义了如下方法:
-
Collection getAttributes(Object object):根据传入的请求对象,获取该请求所需的访问控制元数据,返回一个 ConfigAttribute 对象的集合。
-
Collection getAllConfigAttributes():获取系统中所有已定义的访问控制元数据,返回一个 ConfigAttribute 对象的集合。
-
boolean supports(Class<?> clazz):判断该类是否支持传入的参数类型,如果支持则返回 true,否则返回 false。 FilterInvocationSecurityMetadataSource 接口的实现类负责根据请求 URL ,从数据库或其他外部数据源中获取相应的访问控制元数据,并将其放置到 Spring Security 的全局缓存中供后续使用。常见的实现类包括:
-
AntPathRequestMatcher:基于 Ant 风格的 URL 匹配器,用于匹配请求的 URL。
-
DefaultFilterInvocationSecurityMetadataSource:默认的 FilterInvocationSecurityMetadataSource 实现类,用于获取访问控制元数据。
-
ExpressionBasedFilterInvocationSecurityMetadataSource:基于表达式的 FilterInvocationSecurityMetadataSource 实现类,用于动态获取访问控制元数据。 使用 FilterInvocationSecurityMetadataSource 接口时,我们需要将其注入到 FilterSecurityInterceptor 中,如下所示:
@Configuration
@EnableWebSecurity
public class SecurityConfig extends WebSecurityConfigurerAdapter {
@Autowired
private FilterInvocationSecurityMetadataSource securityMetadataSource;
@Override
protected void configure(HttpSecurity http) throws Exception {
.authorizeRequests()
.antMatchers("/admin/**").hasRole("ADMIN")
.anyRequest().authenticated()
.withObjectPostProcessor(new ObjectPostProcessor<FilterSecurityInterceptor>() {
public <O extends FilterSecurityInterceptor> O postProcess(O fsi) {
fsi.setSecurityMetadataSource(securityMetadataSource);
return fsi;
// ...省略其他配置...
}
在上面的代码中,我们将 FilterInvocationSecurityMetadataSource 的实现类 securityMetadataSource 注入到 configure() 方法中,并使用 setObjectPostProcessor() 方法将其注册到 FilterSecurityInterceptor 中。这样,当用户发起请求时,Spring Security 将从 securityMetadataSource 中获取该请求所需的访问控制元数据,并根据这些元数据进行访问控制。 总结来说,FilterInvocationSecurityMetadataSource 接口用于获取指定请求所需的访问控制元数据,实现类负责根据请求 URL,从数据库或其他外部数据源中获取相应的访问控制元数据,并将其放置到 Spring Security 的全局缓存中供后续使用。同时,我们需要将其注入到 FilterSecurityInterceptor 中,并使用 setObjectPostProcessor() 方法将其注册到 FilterSecurityInterceptor 中,以实现访问控制功能。
这样,当用户发起请求时,Spring Security 将从 securityMetadataSource 中获取该请求所需的访问控制元数据,并根据这些元数据进行访问控制。总结来说,FilterInvocationSecurityMetadataSource 接口用于获取指定请求所需的访问控制元数据,实现类负责根据请求 URL,从数据库或其他外部数据源中获取相应的访问控制元数据,并将其放置到 Spring Security 的全局缓存中供后续使用。
public class My
Invo
cat
ion
Security
Metadata
Source
Service implements
Filter
Invo
cat
ion
Security
Metadata
Source
{
@Autowired
private IRe
source
Dao re
source
Dao;
//<资源,权限列表>存储所有资源与权限
private stati...
6.1 授权认证
之前学了身份认证,就是认证当前登录的用户是否是存在并真实的,身份认证成功后就可以访问认证后的
接口
(资源)了,但即便是已认证的用户也有能访问不能访问的
接口
(资源),那么就需要通过授权认证来判断。
今天学习授权认证,也就是认证当前登录用户都有哪些权限,并确定当前用户的权限是否能访问当前请求的
接口
。
之前在
spring
security
——学习笔记(day03)-UserDetailsSe...
在
Spring
Security
中实现通过数据库动态配置url资源权限,需要通过配置验证过滤器来实现资源权限的加载、验证。系统启动时,到数据库加载系统资源权限列表,当有请求访问时,通过对比系统资源权限列表和用户资源权限列表(在用户登录时添加到用户信息中)来判断用户是否有该url的访问权限。
在配置验证过滤器时需要的配置项有如下几个:
filter
Security
Interceptor:通过继承Abstract
Security
Interceptor并实现
Filter
接口
自定义一个验证过滤...
@Component
public class Custom
Filter
Invo
cat
ion
Security
Metadata
Source
implements
Filter
Invo
cat
ion
Security
Metadata
Source
{
private fi
Security
Metadata
Source
是
Spring
Security
的一个概念模型
接口
。用于表示对受权限保护的"安全对象"的权限设置信息。一个该类对象可以被理解成一个映射表,映射表中的每一项包含如下信息 :
* 安全对象
* 安全对象所需权限信息
围绕该映射表,
Security
Metadata
Source
定义了如下方法 :
Collect
ion
<ConfigAttri...
关于每次请求都要执行两个,即经过重写
Filter
Invo
cat
ion
Security
Metadata
Source
的getAttributes()方法
执行两次的方法
@Override
public Collect
ion
<ConfigAttribute> getAttributes(Object object) throws IllegalArgumentExcept
ion
{
//获取请求地址
String requestUrl = ((
Filter
I
使用自定义
Filter
方式实现的,实现了
Filter
Invo
cat
ion
Security
Metadata
Source
AccessDecis
ion
Manager
接口
,用户权限直接写在代码里,自己可以修改,配置到数据库中。
jar包自己配置
虽然前面我们实现了通过数据库来配置用户与角色,但认证规则仍然是使用Http
Security
进行配置,还是不够灵活,无法实现资源和角色之间的动态调整。这篇文章我们就介绍一下通过数据库查询某个URL资源的访问角色。
四、基于数据库的URL权限规则配置
1、数据库设计
这里在上一篇文章的基础上再添加 资源表和资源权限表 两种数据表,表结构如下所示:
资源表,保存每个菜单的URL
CREATE TABLE `menus` (
`id` bigint(20) unsigned NOT NULL ...
一、实现
Filter
Invo
cat
ion
Security
Metadata
Source
读资源对应的权限,先进行一下筛选
//元数据,根据请求的资源到资源表去找合适的角色
@Service
public class Wgc
Security
Metadata
Source
implements
Filter
Invo
cat
ion
Security
Metadata
Source
{
@Autowi...
使用Http
Security
配置认证授权并不是很灵活,无法实现资源和角色之间的动态调整,要实现动态配置URL权限,
开发
者需要自定义权限配置。(结合总结三实现)
1.数据库设计
在总结三的基础上新增一张资源表和一张角色关联表,如下图所示,资源表中定义了用户能够访问的URL模式,资源角色表定义了访问该模式的URL需要什么样的角色。
2.自定义
Filter
Invo
cat
ion
Security
Metadata
Source
要实现动态配置权限,首先自定义一个类实现
Filter
Invo
cat
ion
S
用户名密码认证、短信验证码认证、踢人下线、 Authorizat
ion
Filter
授权、
Filter
Security
Interceptor url / express
ion
授权、登出、分布式配置。
2、
Security
Config
先添加一个
Security
Config 配置类,作为整个
spring
security
的核心配置,后续的认证、授权等功能都将在整个配置类中完成。
3、用户名密码认证
用户名密码认证主要是自定义实现 UserDetails、UserDetailsService、A