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服务方法中执行这些查询呢?我认为这是一项常见的授权任务。有没有弹簧机构可以做到这一点
# 1 楼答案
例如,对于方法授权,您可以使用
@PreAuthorize("hasRole('ROLE_USER')")
注释在方法的顶部,这里有一个关于该主题的链接: http://docs.spring.io/spring-security/site/docs/3.0.x/reference/el-access.html
为了检查用户的角色,您还可以使用
春季安全3.0
# 2 楼答案
Spring Security 4现在有Spring数据集成:http://docs.spring.io/spring-security/site/docs/current-SNAPSHOT/reference/htmlsingle/#data
在Spring数据回复中:
# 3 楼答案
我会做一个简单的重新设计,这也会使数据层更加可重用。就是这样
服务层
在这里,我们将当前用户的角色传递到数据层
数据层
根据角色查询图书。因此,您可以在以后的“管理”面板中为未登录的用户获取书籍
请注意,我没有时间检查JPQL查询。在
'ADMIN' IN (:roles)
中可能有错误。请检查一下实体模型
映射
Many to many
与Roles
和Books
的关系