jsp <security:authorize access="hasPermission,中的hasPermission方法断点只会进入到DenyAllPermissionEvaluator 中,不会进入到AclPermissionEvaluator 中
时间: 2024-06-07 08:07:01 浏览: 10
`<security:authorize>` 标签是 Spring Security 提供的标签,用于在 JSP 页面中进行权限控制。`hasPermission` 是其中的一个表达式,用于检查当前用户是否具有某个权限。Spring Security 中提供了两个默认实现,即 `AclPermissionEvaluator` 和 `DenyAllPermissionEvaluator`。
`DenyAllPermissionEvaluator` 是一个特殊的实现,它会拒绝所有的权限检查请求,因此如果你使用了它,那么无论你传入什么参数,都不会进入 `AclPermissionEvaluator` 中进行检查。
如果你想使用 `AclPermissionEvaluator`,你需要在 Spring Security 的配置文件中进行相应的配置。具体地说,你需要定义一个自定义的 `PermissionEvaluator`,并将其注册到 Spring Security 中。然后,在 `<security:global-method-security>` 标签中,你需要设置 `pre-post-annotations` 属性为 `enabled`,以启用方法级别的权限控制。最后,在方法上使用 `@PreAuthorize` 或 `@PostAuthorize` 注解,指定相应的权限表达式,即可实现权限控制。
相关问题
<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会自动将它注册到应用程序上下文中。如果您没有声明它为一个组件,请确保它已经在应用程序上下文中注册。
<security:authorize access="hasPermission hasPermission方法怎么调用到MyPermissionEvaluator中的has的方法
在Spring Security中,`hasPermission`表达式需要实现`PermissionEvaluator`接口,该接口中包含一个名为`hasPermission`的方法。当使用`hasPermission`表达式时,Spring Security会自动调用`PermissionEvaluator`中的`hasPermission`方法来验证权限。
要实现`PermissionEvaluator`接口,需要创建一个类,并在其中实现`hasPermission`方法。例如,可以创建一个名为`MyPermissionEvaluator`的类,并在其中实现`hasPermission`方法,如下所示:
```java
public class MyPermissionEvaluator implements PermissionEvaluator {
@Override
public boolean hasPermission(Authentication authentication, Object targetDomainObject, Object permission) {
// 在这里实现权限验证逻辑
// 返回true表示有权限,false表示没有权限
}
@Override
public boolean hasPermission(Authentication authentication, Serializable targetId, String targetType, Object permission) {
// 在这里实现权限验证逻辑
// 返回true表示有权限,false表示没有权限
}
}
```
在`hasPermission`方法中,可以编写自定义的权限验证逻辑。例如,可以检查当前用户是否拥有指定的权限,或者检查当前用户是否属于指定的角色。
然后,在Spring Security的配置文件中,可以将`MyPermissionEvaluator`类配置为`hasPermission`表达式的实现类。例如,可以在XML配置文件中添加以下代码:
```xml
<beans:bean id="myPermissionEvaluator" class="com.example.MyPermissionEvaluator" />
<http use-expressions="true">
<expression-handler ref="expressionHandler" />
</http>
<beans:bean id="expressionHandler" class="org.springframework.security.access.expression.method.DefaultMethodSecurityExpressionHandler">
<beans:property name="permissionEvaluator" ref="myPermissionEvaluator" />
</beans:bean>
```
这样,Spring Security就会使用`MyPermissionEvaluator`类中的`hasPermission`方法来验证`hasPermission`表达式中的权限。