xml 重写SecurityExpressionRoot 方法
时间: 2023-06-17 07:09:09 浏览: 58
在 XML 配置中,可以使用 `<global-method-security>` 元素配置 `security-expression-handler` 属性为 `org.springframework.security.access.expression.method.DefaultMethodSecurityExpressionHandler`,然后自定义 `DefaultMethodSecurityExpressionHandler` 的子类,在其中重写 `createSecurityExpressionRoot` 方法,返回自定义的 `SecurityExpressionRoot` 子类对象。
以下是一个示例:
首先,在 XML 配置文件中添加以下内容:
```
<global-method-security pre-post-annotations="enabled">
<expression-handler ref="customMethodSecurityExpressionHandler" />
</global-method-security>
<bean id="customMethodSecurityExpressionHandler" class="com.example.CustomMethodSecurityExpressionHandler">
<property name="permissionEvaluator" ref="customPermissionEvaluator" />
</bean>
<bean id="customPermissionEvaluator" class="com.example.CustomPermissionEvaluator" />
```
然后,在 `CustomMethodSecurityExpressionHandler` 类中重写 `createSecurityExpressionRoot` 方法,如下所示:
```
public class CustomMethodSecurityExpressionHandler extends DefaultMethodSecurityExpressionHandler {
@Override
protected MethodSecurityExpressionOperations createSecurityExpressionRoot(Authentication authentication, MethodInvocation invocation) {
CustomMethodSecurityExpressionRoot root = new CustomMethodSecurityExpressionRoot(authentication);
root.setThis(invocation.getThis());
root.setPermissionEvaluator(getPermissionEvaluator());
root.setTrustResolver(getTrustResolver());
root.setRoleHierarchy(getRoleHierarchy());
return root;
}
}
```
最后,在 `CustomMethodSecurityExpressionRoot` 类中添加自定义的安全表达式方法,如下所示:
```
public class CustomMethodSecurityExpressionRoot extends MethodSecurityExpressionRoot {
public CustomMethodSecurityExpressionRoot(Authentication authentication) {
super(authentication);
}
public boolean hasCustomPermission(Object targetObject, String permission) {
// 自定义权限检查逻辑
return true;
}
}
```
现在,你就可以在 XML 配置中使用自定义安全表达式方法了,如下所示:
```
<bean id="customService" class="com.example.CustomServiceImpl" />
<sec:pre-post-annotations>
<sec:method-security-expressions>
<sec:expression-handler ref="customMethodSecurityExpressionHandler" />
<sec:expression="@customMethodSecurityExpressionRoot.hasCustomPermission(#customService, 'customPermission')" />
</sec:method-security-expressions>
</sec:pre-post-annotations>
```
在上面的示例中,我们使用 `@customMethodSecurityExpressionRoot.hasCustomPermission(#customService, 'customPermission')` 表达式来检查是否具有自定义权限。其中,`#customService` 表示方法参数中的 `CustomService` 对象。