根据权限从数据库中获取数据。

问题描述 投票:0回答:1

我正在开发一个应用程序,其中我需要开发基于角色的访问控制。我试着找过其他的答案,但那些答案提供了一些不同的解决方案。角色是动态的,但是权限是静态的,根据我们的应用程序中的模块,目前是这样的。

我的情况是这样的。

我有员工和医生,员工连接到医生。所以权限是 "View Physician", "Edit Physician", "View Appointment", "Edit Appointment"等。

一个员工可以是全局用户,也可以是本地用户,所以如果一个员工是全局用户,他对每个医生都有权限。所以假设一个员工是全局用户,他有每个医生的权限,如果一个员工是本地用户,他有对特定医生的权限,那么当一个员工进入预约列表时,api应该根据他的权限返回数据,他应该只能看到这些医生的预约列表。

现在,当一个员工进入预约列表时,api应该根据他的权限返回数据,他应该只能看到那些给他 "查看预约 "权限的医生的预约列表。

使用 "查看预约">。hasRolehasAuthority我可以限制整个API,但我需要根据权限从数据库中获取数据。在JPA查询中硬编码每个数据库的权限将是太多了。

所以我希望得到一些关于架构或设计模式的建议和帮助。

java spring spring-security authorization system-design
1个回答
0
投票

好吧,你的问题真的很宽泛,但我试着回答......

对于这种情况,spring security是最好的方法,你可以根据用户定义的角色来控制任何API的访问。

配置 的方法 WebSecurityConfigurerAdapter 类来配置用户的特定角色,并根据角色映射URL模式。

记住WebSecurityConfigurerAdapter类。 有三个版本的 配置 方法,但在这种情况下,你只需要两个版本,其中一个用于映射用户,即 配置(AuthenticationManagerBuilder auth) 和一个用于将url模式与他们的特定角色进行映射,即 配置(HttpSecurity http)

因此,通过将URL与特定的角色进行映射,你可以很容易地根据用户角色控制API调用,因此JPA查询不需要角色的硬编码。

我给大家分享一个例子,如何根据角色来映射url。

protected void configure(HttpSecurity http){
   http.authorizeRequests()
            .antMatchers("/")
            .hasRole("Physician")
            .and()
            .formLogin()

您也可以使用任何其他方式进行登录

希望对大家的探索有所帮助和激励。


0
投票

根据不同查询用例的要求,我会相应地使用不同的策略。

  1. 对于返回单个记录的用例(如通过ID查找记录),SQL查询应该不知道用户权限。做应用层的安全检查,使用 @PostAuthorize 从数据库中获取数据后。

  2. 对于返回记录列表的使用情况,允许用户配置偏移或限制(即分页使用情况),SQL查询知道用户权限,这意味着我们需要根据用户权限在SQL查询中添加必要的where子句。

    这样做的主要原因基本上是为了数据集大时的性能,如果在应用端使用 @PostFilter.

    例如,想想看,如果你需要得到第5200到5400条记录,一个用户被允许查看,但你不允许添加任何基于用户权限的SQL查询where子句的情况下,你将如何解决这个问题,如果所有的安全检查是在应用程序端完成?我只能想象,即使我正确地实现它,代码将是非常混乱和效率不高......。

  3. 对于使用情况,返回一个记录列表,但用户不能配置的东西,如偏移量或限制,我会使用相同的策略(1),但使用 @PostFitler 这一次,我们要做的是将安全逻辑作为一个交叉的关注点,让核心领域的逻辑代码不知道它的存在。

所以除非有特殊的原因,比如(2),否则总的目标是尽可能把安全逻辑作为一个交叉关注点,让核心领域的逻辑代码不应该意识到它的存在.安全代码应该集中在一个地方packagemodules等,而不是分散在各个代码中。这基本上意味着,我们使用spring security提供的AOP技术,在查询方法执行完毕后,对返回的对象执行一些安全检查代码。


0
投票

最常用的一种方法是创建用户组,并将其附加到适用的用户上。然后,你可以开发一个限制框架,它将具有创建、更新、删除、启用、禁用等限制的功能。一旦你将有这个框架,你就可以将限制应用到你的JPA查询中。你可以查看的一个例子是 这个. 请注意,这个平台使用自己的查询语言,类似于 HQL,称为灵活的搜索查询。它会给你一个公平的想法,从自己的限制框架开始。

© www.soinside.com 2019 - 2024. All rights reserved.