JSP使用<security:authorize access="hasPermission('read','formDialog:edit')">后,断点一直进的是DenyAllPermissionEvaluator的hasPermission方法
时间: 2024-06-05 10:09:41 浏览: 5
<security:authorize> 标签是 Spring Security 提供的,用于在 JSP 页面中控制是否显示某些内容,需要配合 Spring Security 的权限控制使用。
在您的代码中,使用了 `hasPermission` 方法,这个方法是 Spring Security 提供的用于判断是否有权限的方法。其中,`hasPermission('read','formDialog:edit')` 表示需要判断是否有 `read` 权限和 `formDialog:edit` 对象的权限。
如果您的授权策略是基于 RBAC(基于角色的访问控制),则需要在 Spring Security 的配置文件中配置相应的角色和权限。如果您的授权策略是基于 ACL(访问控制列表),则需要使用 ACL 相关的 API 进行授权。
关于您提到的 `DenyAllPermissionEvaluator`,它是 Spring Security 提供的默认的权限验证器,如果没有配置其他的权限验证器,Spring Security 将默认使用这个权限验证器。这个权限验证器的作用是拒绝所有的权限请求,因此您遇到的问题可能是因为没有正确配置权限验证器导致的。建议您检查一下 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>
```
相关推荐
![docx](https://img-home.csdnimg.cn/images/20210720083331.png)
![gz](https://img-home.csdnimg.cn/images/20210720083447.png)
![zip](https://img-home.csdnimg.cn/images/20210720083736.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)