WebExpressionAuthorizationManager 类用于基于表达式语言实现复杂的访问控制决策。
WebExpressionAuthorizationManager 类允许你使用 SpEL(Spring Expression Language)定义复杂的访问控制规则,比基于权限的简单验证更灵活。
表达式驱动的授权,通过 SpEL 表达式定义授权规则,支持访问请求参数、会话、认证信息等。
内置表达式支持,提供预定义的表达式变量(如 hasRole、isAuthenticated)简化常见场景。
与 SecurityContext 集成,可访问当前用户的认证信息、权限和其他安全上下文。
下面是 SpEL 表达式中支持的内表达式:
表达式 | 描述 |
---|---|
permitAll | 允许所有请求,无需认证。 |
denyAll | 拒绝所有请求。 |
isAnonymous() | 允许匿名用户访问。 |
isAuthenticated() | 仅允许已认证用户访问。 |
isFullyAuthenticated() | 仅允许非记住我(remember-me)方式认证的用户访问。 |
hasRole('ROLE_ADMIN') | 仅允许拥有 ROLE_ADMIN 角色的用户访问(自动添加 ROLE_ 前缀)。 |
hasAuthority('read') | 仅允许拥有 read 权限的用户访问。 |
hasIpAddress('192.168.1.0/24') | 仅允许来自指定 IP 范围的请求。 |
hasAnyRole('ADMIN', 'USER') | 允许拥有任一指定角色的用户访问。 |
hasAnyAuthority('read', 'write') | 允许拥有任一指定权限的用户访问。 |
@beanName.method(authentication, request) | 调用自定义 Bean 方法进行授权决策。 |
下面示例通过表达式实现对 /sys 表达式的控制,如下:
http.authorizeHttpRequests(authorize -> authorize // 需要具有 admin 角色权限或者拥有 menu:sys:delete 权限才能访问 /sys 路径的请求 .requestMatchers("/sys/**").access(new WebExpressionAuthorizationManager( "hasRole('admin') or hasAuthority('menu:sys:delete')")) .anyRequest().authenticated() // 其他请求需认证 )