我正在开发一个应用程序,其中我需要开发基于角色的访问控制。我试着找过其他的答案,但那些答案提供了一些不同的解决方案。角色是动态的,但是权限是静态的,根据我们的应用程序中的模块,目前是这样的。
我的情况是这样的。
我有员工和医生,员工连接到医生。所以权限是 "View Physician", "Edit Physician", "View Appointment", "Edit Appointment"
等。
一个员工可以是全局用户,也可以是本地用户,所以如果一个员工是全局用户,他对每个医生都有权限。所以假设一个员工是全局用户,他有每个医生的权限,如果一个员工是本地用户,他有对特定医生的权限,那么当一个员工进入预约列表时,api应该根据他的权限返回数据,他应该只能看到这些医生的预约列表。
现在,当一个员工进入预约列表时,api应该根据他的权限返回数据,他应该只能看到那些给他 "查看预约 "权限的医生的预约列表。
使用 "查看预约">。hasRole
和 hasAuthority
我可以限制整个API,但我需要根据权限从数据库中获取数据。在JPA查询中硬编码每个数据库的权限将是太多了。
所以我希望得到一些关于架构或设计模式的建议和帮助。
好吧,你的问题真的很宽泛,但我试着回答......
对于这种情况,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()
注 您也可以使用任何其他方式进行登录
希望对大家的探索有所帮助和激励。
根据不同查询用例的要求,我会相应地使用不同的策略。
对于返回单个记录的用例(如通过ID查找记录),SQL查询应该不知道用户权限。做应用层的安全检查,使用 @PostAuthorize
从数据库中获取数据后。
对于返回记录列表的使用情况,允许用户配置偏移或限制(即分页使用情况),SQL查询知道用户权限,这意味着我们需要根据用户权限在SQL查询中添加必要的where子句。
这样做的主要原因基本上是为了数据集大时的性能,如果在应用端使用 @PostFilter
.
例如,想想看,如果你需要得到第5200到5400条记录,一个用户被允许查看,但你不允许添加任何基于用户权限的SQL查询where子句的情况下,你将如何解决这个问题,如果所有的安全检查是在应用程序端完成?我只能想象,即使我正确地实现它,代码将是非常混乱和效率不高......。
对于使用情况,返回一个记录列表,但用户不能配置的东西,如偏移量或限制,我会使用相同的策略(1),但使用 @PostFitler
这一次,我们要做的是将安全逻辑作为一个交叉的关注点,让核心领域的逻辑代码不知道它的存在。
所以除非有特殊的原因,比如(2),否则总的目标是尽可能把安全逻辑作为一个交叉关注点,让核心领域的逻辑代码不应该意识到它的存在.安全代码应该集中在一个地方packagemodules等,而不是分散在各个代码中。这基本上意味着,我们使用spring security提供的AOP技术,在查询方法执行完毕后,对返回的对象执行一些安全检查代码。