有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java如何授权Spring应用程序的服务层?

我正在开发一个应用程序,可以在网站上显示数据库中的信息。应用程序使用Spring Security进行保护,我的用户可以有不同的角色。应根据当前用户的角色显示记录。例如,我想显示数据库中的书籍。角色X只能看到一些书,角色Y也可以。但是角色ADMIN可以看到所有的书

现在我想知道授权发生在哪里以及如何发生。我认为服务层是一个好地方,但是我如何查询当前用户角色可以访问的书籍呢

我的桌子是这样的:

book (id, name)
role (id, name)
role_book (id, role_id, book_id)

因此,对这些书的查询将是SELECT b.id, b.name FROM book b, role r role_book rb WHERE b.id = rb.book_id AND r.id = rb.role_id AND r.name IN (<roles of the current user>)。当当前用户拥有ADMIN角色时,我只需选择数据库中的所有书籍

但是如何在Spring服务方法中执行这些查询呢?我认为这是一项常见的授权任务。有没有弹簧机构可以做到这一点


共 (3) 个答案

  1. # 3 楼答案

    我会做一个简单的重新设计,这也会使数据层更加可重用。就是这样

    服务层

    在这里,我们将当前用户的角色传递到数据层

    Iterable<Book> findAllMyBooks(){
    ...
        List<String> roles = new ArrayList<>();
        Authentication authentication = SecurityContextHolder.getContext()getAuthentication();
        for (GrantedAuthority auth : authentication.getAuthorities()) {
            roles.add(auth.getAuthority());
        }
        bookRepository.findAllByRoles(roles);
    ...
    }
    

    数据层

    根据角色查询图书。因此,您可以在以后的“管理”面板中为未登录的用户获取书籍

    请注意,我没有时间检查JPQL查询。在'ADMIN' IN (:roles)中可能有错误。请检查一下

    @Query("SELECT b FROM Book b INNER JOIN b.roles r WHERE r.name IN (:roles) OR 'ADMIN' IN (:roles)")
    Iterable<Book> findAllByRoles(@Param("roles") List<String> roles);
    

    实体模型

    映射Many to manyRolesBooks的关系