为什么我会收到“权限被拒绝”的信息?

时间:2020-11-11 18:45:56

标签: spring-boot exception filter permission-denied

我正在运行一个Spring Boot 2.2.2应用程序,该应用程序已连接到具有大量现有表的Postgres 9.6 DB。而且运行良好。 现在,我想从扩展org.springframework.web.filter.OncePerRequestFilter的过滤器中对新创建的表执行SELECT。

将为使用的用户创建并授予SELECT权限的数据库表。从PgAdmin内查询表效果很好,但通过我的存储库类(从filter类内调用)访问表会导致:

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());在相同架构中查询另一个表,该表具有完全相同的权限(对-UPDATE,INSERT,SELECT,DELETE)。

正如我已经说过的:getFoo()失败,权限被拒绝很奇怪,但是getC()的效果很好,而且稍后我调用getFoo()时也很奇怪(从服务中)在代码中没有得到任何拒绝,但得到了有效的Resultset

1 个答案:

答案 0 :(得分:0)

已解决。这是由于缺少特殊用户的权限所致。