为啥我会收到“权限被拒绝”?
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 权限被拒绝”?