我正在运行一个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
。
答案 0 :(得分:0)
已解决。这是由于缺少特殊用户的权限所致。