使用自定义PermissionEvaluator的方法安全性不适用于Spring Security

问题描述 投票:0回答:1

我正在努力使用我的Spring Security配置,到目前为止我无法使其工作。需要你的帮助。

这是我的配置:

@Configuration
@EnableGlobalMethodSecurity(prePostEnabled = true)
public class MethodSecurityConfig extends GlobalMethodSecurityConfiguration {

    @Override
    protected MethodSecurityExpressionHandler createExpressionHandler() {
        DefaultMethodSecurityExpressionHandler expressionHandler =
                new DefaultMethodSecurityExpressionHandler();
        expressionHandler.setPermissionEvaluator(new CustomPermissionEvaluator());
        return expressionHandler;
    }
}

这是CustomPermissionEvaluator

public class CustomPermissionEvaluator implements PermissionEvaluator {

    @Override
    public boolean hasPermission(Authentication auth, Object targetDomainObject, Object permission) {
        return true;
    }

    @Override
    public boolean hasPermission(Authentication auth, Serializable targetId, String targetType, Object permission) {
        return true;
    }
}

这是控制器:

@PreAuthorize("hasPermission(#test, 'write')")
@PostMapping("/test")
public Result saveTest(@RequestBody Test test) {
    return Result.build();
}

一切看起来都很简单,但是当我请求其余的API时,得到以下异常:

.m.m.a.ExceptionHandlerExceptionResolver : Resolved exception caused by Handler execution: org.springframework.security.authentication.AuthenticationCredentialsNotFoundException: An Authentication object was not found in the SecurityContext

任何人都可以给我任何关于做什么的暗示?谢谢〜

java spring-security
1个回答
0
投票

错误是指缺少Authentication对象而不是Authorization。你有没有定义一个UserDetailsService,你确定你的身份验证成功了吗?

根据this blog,您可以通过定义获取AuthenticationManagerBuilder的方法来连接userDetailService。在此构建器上,您可以定义一个简单的inMemoryAuthentication进行测试,或者连接AuthenticationProviderUserDetailService的实现。

© www.soinside.com 2019 - 2024. All rights reserved.