security.xml重写SecurityExpressionRoot 方法 ,是jsp 可以使用<security:authorize access="hasPermission('formDialog:edit')">调用,只传一个参数
时间: 2023-06-17 18:08:56 浏览: 199
首先需要明确的是,`SecurityExpressionRoot`是Spring Security中的一个类,用于在访问控制表达式中提供一些基础的安全方法和属性。而`security.xml`是Spring Security的配置文件,用于配置安全相关的参数。
在`SecurityExpressionRoot`中,有一个`hasPermission`方法,用于判断当前用户是否拥有指定的权限。如果想要重写这个方法,可以创建一个自定义的`SecurityExpressionRoot`子类,并重写`hasPermission`方法。例如:
```java
public class CustomSecurityExpressionRoot extends SecurityExpressionRoot {
public CustomSecurityExpressionRoot(Authentication authentication) {
super(authentication);
}
public boolean hasPermission(String permission) {
// 自定义权限判断逻辑
}
}
```
然后,在配置文件中,需要将`securityExpressionHandler`指定为自定义的`DefaultWebSecurityExpressionHandler`子类,并在该子类中设置上述自定义的`CustomSecurityExpressionRoot`。例如:
```xml
<security:http>
<security:intercept-url pattern="/formDialog/**" access="hasPermission('formDialog:edit')"/>
<security:expression-handler ref="customSecurityExpressionHandler"/>
</security:http>
<bean id="customSecurityExpressionHandler" class="org.springframework.security.web.access.expression.DefaultWebSecurityExpressionHandler">
<property name="permissionEvaluator" ref="customPermissionEvaluator"/>
<property name="rootObjectFactory" ref="customSecurityExpressionRootFactory"/>
</bean>
<bean id="customPermissionEvaluator" class="org.springframework.security.access.expression.method.DefaultMethodSecurityExpressionHandler">
<property name="permissionCacheOptimizer">
<bean class="org.springframework.security.access.expression.method.DefaultMethodSecurityExpressionHandler$1"/>
</property>
</bean>
<bean id="customSecurityExpressionRootFactory" class="org.springframework.security.web.access.expression.DefaultWebSecurityExpressionRootFactory">
<constructor-arg ref="customPermissionEvaluator"/>
</bean>
```
最后,在JSP页面中,可以使用`<security:authorize>`标签来根据权限判断是否显示某个内容。例如:
```jsp
<security:authorize access="hasPermission('formDialog:edit')">
<a href="/formDialog/edit">Edit Form Dialog</a>
</security:authorize>
```
需要注意的是,`hasPermission`方法只接受一个参数,即权限表达式。如果需要传递更多的参数,可以在自定义`CustomSecurityExpressionRoot`类中新增方法,并在表达式中调用该方法。例如:
```java
public class CustomSecurityExpressionRoot extends SecurityExpressionRoot {
public CustomSecurityExpressionRoot(Authentication authentication) {
super(authentication);
}
public boolean hasPermission(String formId, String permission) {
// 自定义权限判断逻辑,根据formId和permission判断是否有权限
}
}
```
然后,在JSP页面中,可以使用如下表达式:
```jsp
<security:authorize access="hasPermission(formId, 'edit')">
<a href="/formDialog/edit">Edit Form Dialog</a>
</security:authorize>
```
阅读全文