为啥我会收到“权限被拒绝”?

Posted

技术标签:

【中文标题】为啥我会收到“权限被拒绝”?【英文标题】:Why do I get a 'Permission denied'?为什么我会收到“权限被拒绝”? 【发布时间】: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

【问题讨论】:

没有看到实际代码,几乎不可能准确回答您的问题。您需要显示您的过滤器代码以及您如何设置权限。 【参考方案1】:

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

【讨论】:

以上是关于为啥我会收到“权限被拒绝”?的主要内容,如果未能解决你的问题,请参考以下文章

当我尝试使用 EF 在 ASP.NET MVC5 中查询视图时,为啥会收到错误“数据库 'ELITEPROD' 中的 CREATE TABLE 权限被拒绝”?

为啥 pip 在安装 scikit-learn 时会出现权限被拒绝的错误?

.bashrc:权限被拒绝

Bitbucket 权限被拒绝(公钥)。但适用于 ssh

/usr/local/bin/ 中作曲家的权限被拒绝

查找中的权限被拒绝:为啥我们需要 2>&1?