【发布时间】:2020-11-11 18:45:56
【问题描述】:
我正在运行一个 Spring Boot 2.2.2 应用程序,该应用程序连接到一个 Postgres 9.6 数据库,其中已有很多表。它运行良好。
现在,我想从扩展 org.springframework.web.filter.OncePerRequestFilter 的过滤器中对新创建的表执行 SELECT。
数据库表已创建并授予已使用用户的 SELECT 权限。从 PgAdmin 中查询表效果很好,但通过我的存储库类(从过滤器类中调用)访问表会导致:
2020-11-11 19:16:39.077 WARN 4946 --- [nio-8080-exec-2] o.h.engine.jdbc.spi.SqlExceptionHelper : SQL Error: 0, SQLState: 42501
2020-11-11 19:16:39.078 ERROR 4946 --- [nio-8080-exec-2] o.h.engine.jdbc.spi.SqlExceptionHelper : ERROR: permission denied for relation my_new_table
2020-11-11 19:16:39.271 ERROR 4946 --- [nio-8080-exec-2] o.a.c.c.C.[.[.[/].[dispatcherServlet] : Servlet.service() for servlet [dispatcherServlet] in context with path [] threw exception
奇怪的是,当我向另一个表提交一个 SELECT 时,该表具有与新表相同的权限,只有一个 LOC 前面......这就像一个魅力。
当我在代码中稍后访问新表时,例如从服务内部,它确实不会导致权限被拒绝。
这种行为的原因可能是什么?我该如何解决这个问题?
过滤器类:
@Service
public class AuthorizationFilter extends OncePerRequestFilter {
private Logger logger = LoggerFactory.getLogger(AuthorizationFilter.class);
private MyPersistenceService myPersistenceService;
public AuthorizationFilter(MyPersistenceService myPersistenceService) {
this.myPersistenceService = myPersistenceService;
}
@Override
protected void doFilterInternal(HttpServletRequest request, HttpServletResponse response, FilterChain filterChain)
throws ServletException, IOException {
...
logger.debug("Authenticating user '{}'", x.getUserId());
AuthenticatedUser authenticatedUser = AuthenticatedUser.Companion.from(user, grantedAuths, x,
// new ArrayList<Foo>());
myPersistenceService.getFoo(x.getUserId()));
// AuthenticatedUser authenticatedUser = AuthenticatedUser.Companion.from(user, grantedAuths, x);
final C c = myPersistenceService.getC(x.getUserId());
...
myPersistenceService.getFoo() 最终查询 my_new_table
myPersistenceService.getC(x.getUserId()); 查询具有完全相同权限的同一架构中的另一个表(ward - UPDATE、INSERT、SELECT、DELETE)。
正如我已经说过的:getFoo() 因 permission denied 而失败很奇怪,但 getC() 运行良好,而且当我稍后在代码中调用 getFoo() 时也很奇怪(来自服务)我没有获得拒绝权限,而是一个有效的Resultset。
【问题讨论】:
-
没有看到实际代码,几乎不可能准确回答您的问题。您需要显示您的过滤器代码以及您如何设置权限。
标签: spring-boot exception filter permission-denied