jsp <security:authorize access="hasPermission,中的hasPermission方法断点只会进入到DenyAllPermissionEvaluator 中,不会进入到AclPermissionEvaluator 中
时间: 2024-06-07 19:07:01 浏览: 79
`<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会自动将它注册到应用程序上下文中。如果您没有声明它为一个组件,请确保它已经在应用程序上下文中注册。
jsp 页面<security:authorize access="hasPermission;hasPermission方法不能跳转到主自定义重新的方法
`hasPermission` 是 Spring Security 中的一个表达式,用于判断当前用户是否有指定权限。它通常用在 JSP 页面中的 `<security:authorize>` 标签中,例如:
```jsp
<security:authorize access="hasPermission('admin')">
<!-- 只有具有 admin 权限的用户才能看到这里的内容 -->
<a href="/admin">管理页面</a>
</security:authorize>
```
如果你需要在 `hasPermission` 方法中进行页面跳转,可以将页面跳转的逻辑写在一个自定义的方法中,然后在 `hasPermission` 中调用该方法。例如:
```java
public class MySecurityExpressionRoot extends SecurityExpressionRoot {
public boolean myCustomMethod() {
// 页面跳转逻辑
return true;
}
public MySecurityExpressionRoot(Authentication authentication) {
super(authentication);
}
public boolean hasPermission() {
// 调用自定义的方法
return myCustomMethod();
}
}
```
然后在 Spring Security 的配置中,使用 `DefaultWebSecurityExpressionHandler` 类来设置自定义的 `SecurityExpressionRoot` 实现类:
```xml
<bean id="expressionHandler" class="org.springframework.security.web.access.expression.DefaultWebSecurityExpressionHandler">
<property name="permissionEvaluator" ref="myPermissionEvaluator" />
<property name="rootObject" >
<bean class="com.example.security.MySecurityExpressionRoot" />
</property>
</bean>
```
最后,在 JSP 页面中使用 `hasPermission` 方法时,传入方法名即可:
```jsp
<security:authorize access="hasPermission('myCustomMethod')">
<!-- 只有调用 myCustomMethod 方法返回 true 的用户才能看到这里的内容 -->
<a href="/myCustomPage">自定义页面</a>
</security:authorize>
```
阅读全文