JSP使用<security:authorize access="hasPermission('read','formDialog:edit')">后,断点一直进的是DenyAllPermissionEvaluator的hasPermission方法
时间: 2024-06-05 21:10:27 浏览: 16
这个问题可能是由于没有正确配置访问控制表达式的原因导致的。在使用`<security:authorize>`标记时,需要使用Spring Security提供的表达式语言来定义授权规则。
在这种情况下,你需要检查以下几点:
1. 确保正确配置了Spring Security,包括正确配置了`<security:http>`和`<security:global-method-security>`。
2. 确保你使用的是正确的授权表达式。在这里,你使用的是`hasPermission`,这是Spring Security中的一个内置表达式,用于检查用户是否有访问某个资源的权限。你需要确定你的权限表达式是否正确。
3. 确保你已经在你的应用程序中定义了适当的权限。在这种情况下,你使用的是`read`和`formDialog:edit`,这些应该在你的应用程序中定义为权限,以便Spring Security可以在运行时检查它们。
如果你已经检查了以上几点,但问题仍然存在,那么你可以尝试在调试过程中打印出调试信息,以便更好地理解问题的根本原因。
相关问题
Jsp配置了<security:authorize access="hasPermission('read','formDialog:edit')">后,断点一直进的是DenyAllPermissionEvaluator的hasPermission方法
如果你的JSP配置了`<security:authorize>`标签,并且指定了`access`属性为`hasPermission('read','formDialog:edit')`,那么在运行时Spring Security会调用`hasPermission`方法来检查当前用户是否有权限访问该资源。
如果你的断点一直进入了`DenyAllPermissionEvaluator`的`hasPermission`方法,那么可能是因为你的权限配置有问题。`DenyAllPermissionEvaluator`是Spring Security提供的一个权限评估器,它会始终返回false,即拒绝所有请求。这意味着你的Spring Security配置中没有任何授权规则,或者授权规则配置有误。
你需要检查一下你的Spring Security配置,确保已经正确地配置了授权规则,并且当前用户具有访问该资源的权限。你也可以尝试调试`hasPermission`方法,查看其中的具体逻辑,找出问题所在。
security.xml重写SecurityExpressionRoot 方法 ,是jsp 可以使用<security:authorize access="hasPermission('formDialog:edit')">调用,只传一个参数
首先需要明确的是,`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>
```