在Spring Security中,DefaultMethodSecurityExpressionHandler
是处理方法安全表达式的默认处理器。如果你想注册自定义的安全表达式方法,你需要创建一个自定义的表达式处理器,继承自DefaultMethodSecurityExpressionHandler
,并重写createSecurityExpressionRoot
方法来提供你自己的MethodSecurityExpressionOperations
实现。
以下是注册自定义安全表达式方法的步骤:
-
创建一个自定义的
MethodSecurityExpressionRoot
类,扩展SecurityExpressionRoot
并实现MethodSecurityExpressionOperations
接口。在这个类中,你可以添加自定义方法,这些方法将在SpEL表达式中使用。public class CustomMethodSecurityExpressionRoot extends SecurityExpressionRoot implements MethodSecurityExpressionOperations { public CustomMethodSecurityExpressionRoot(Authentication authentication) { super(authentication); } // 添加你的自定义方法 public boolean isMember(Long organizationId) { // 你的自定义逻辑 } // 其他可能需要重写的方法 }
-
创建一个自定义的表达式处理器,继承自
DefaultMethodSecurityExpressionHandler
,并重写createSecurityExpressionRoot
方法,以返回你的自定义MethodSecurityExpressionRoot
实例。public class CustomMethodSecurityExpressionHandler extends DefaultMethodSecurityExpressionHandler { @Override protected MethodSecurityExpressionOperations createSecurityExpressionRoot(Authentication authentication, MethodInvocation invocation) { CustomMethodSecurityExpressionRoot root = new CustomMethodSecurityExpressionRoot(authentication); root.setPermissionEvaluator(getPermissionEvaluator()); root.setTrustResolver(getTrustResolver()); root.setRoleHierarchy(getRoleHierarchy()); return root; } }
-
在你的配置类中,使用
@EnableGlobalMethodSecurity
注解来启用方法安全,并使用MethodSecurityConfigurer
来设置自定义的表达式处理器。@Configuration @EnableGlobalMethodSecurity(prePostEnabled = true) public class MethodSecurityConfig extends GlobalMethodSecurityConfiguration { @Override protected MethodSecurityExpressionHandler createExpressionHandler() { return new CustomMethodSecurityExpressionHandler(); } }
-
现在你可以在方法安全注解中使用你的自定义表达式了。
@PreAuthorize("isMember(#id)") public void someMethod() { // ... 方法体 ... }
在getPermissionEvaluator()
方法中获取自定义的权限评估器,你需要实现PermissionEvaluator
接口,并在CustomMethodSecurityExpressionHandler
中通过setPermissionEvaluator
方法设置它。这样,你就可以在自定义的MethodSecurityExpressionRoot
中使用自定义的权限评估逻辑了。
以上步骤基于搜索结果中的信息,特别是来自Baeldung的教程,它详细解释了如何创建和注册自定义的安全表达式方法。