JSP使用<security:authorize access="hasPermission('read','formDialog:edit')">后,断点一直进的是DenyAllPermissionEvaluator的hasPermission方法
时间: 2024-06-05 20:09:41 浏览: 64
<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:authorize access="hasPermission 方法,断点一直进入的是DenyAllPermissionEvaluator的hasPermission方法
该问题可能是由于您的安全配置中使用了DenyAllPermissionEvaluator而导致的。DenyAllPermissionEvaluator是一个默认的权限评估器,它会拒绝所有的权限请求。
您可以尝试在您的安全配置中定义一个自定义的PermissionEvaluator,并确保它正确地实现了hasPermission方法。例如,您可以实现一个名为MyPermissionEvaluator的类,并在您的配置中使用它,如下所示:
```
@Configuration
@EnableWebSecurity
public class SecurityConfig extends WebSecurityConfigurerAdapter {
@Autowired
private MyPermissionEvaluator myPermissionEvaluator;
@Override
protected void configure(HttpSecurity http) throws Exception {
http.authorizeRequests()
.accessDecisionManager(accessDecisionManager())
.anyRequest().authenticated()
.and()
.formLogin()
.and()
.httpBasic();
}
@Bean
public AccessDecisionManager accessDecisionManager() {
List<AccessDecisionVoter<?>> decisionVoters = new ArrayList<>();
decisionVoters.add(new WebExpressionVoter());
decisionVoters.add(new RoleVoter());
decisionVoters.add(new AuthenticatedVoter());
AffirmativeBased accessDecisionManager = new AffirmativeBased(decisionVoters);
accessDecisionManager.setAllowIfAllAbstainDecisions(true);
return accessDecisionManager;
}
@Bean
public DefaultWebSecurityExpressionHandler webSecurityExpressionHandler() {
DefaultWebSecurityExpressionHandler handler = new DefaultWebSecurityExpressionHandler();
handler.setPermissionEvaluator(myPermissionEvaluator);
return handler;
}
}
```
然后,实现您的MyPermissionEvaluator类,确保hasPermission方法返回正确的结果:
```
@Component
public class MyPermissionEvaluator implements PermissionEvaluator {
@Override
public boolean hasPermission(Authentication authentication, Object targetDomainObject, Object permission) {
// 根据您的实际需求实现此方法,返回true或false
return false;
}
@Override
public boolean hasPermission(Authentication authentication, Serializable targetId, String targetType, Object permission) {
// 根据您的实际需求实现此方法,返回true或false
return false;
}
}
```
注意:在这个例子中,我们将MyPermissionEvaluator声明为一个组件(@Component),这样Spring会自动将它注册到应用程序上下文中。如果您没有声明它为一个组件,请确保它已经在应用程序上下文中注册。
阅读全文