我的应用程序当前有两种类型的用户: Admin 或 Normal 用户。
该应用程序有多个项目:100个或更多。对于每个项目,用户具有不同的角色,例如项目所有者,客户等。
我现在正在寻找将这些次角色放置到位的最佳方法。
因为在我的服务中,我想使用PreAuthorise("hasRole('OWNER')")
,以便只有合适的人才能执行更新等操作。
我现在想尝试的是通过Spring Security登录时,为每个项目提供一个使用角色(项目所有者,客户等)的用户列表,我检索用户并提取所有项目他是其中的一员,然后我按照ROLE_PROJECTNAME_OWNER
或ROLE_PROJECTNAME_CLIENT
的角色添加。
问题是我不能使用HASROLE
,因为有很多项目,所以我无法预先注释允许在服务层中进行方法调用的项目。我也不能只添加OWNER
,因为这样我就不知道在哪个项目中。所以我在这里有些卡住,如何正确执行此操作。
答案 0 :(得分:0)
为什么不将用户及其所属的组与他们可以访问的角色和服务区分开。
您可以通过多种方式执行此操作,但是一种方法是让中央身份验证框架在用户执行身份验证后为您提供用户组。
现在,每个服务中的组和角色之间都有一个映射。这些角色是特定于应用程序的,身份验证服务或其他应用程序并不关心它们。您可以将此映射存储在单个应用程序的数据库中,或存储在简单的配置文件中(可能只是存储在特定应用程序的application.yaml
中)。
您当前的组是Admin
和Normal
,但是您可以有其他组。用户也可以是多个组的成员。因此,在应用程序1中,您可以说Admin
用户可以执行角色1,角色2,角色3,而Normal
用户只能执行role 1
。再次,这是很多很多。一旦UserDetails
实例识别出已通过身份验证的用户及其组,这些实例便会随身携带,然后将它们映射为角色,作为Spring Security配置的一部分。然后,您将可以对服务进行PreAuthorise("hasRole('OWNER')")
等操作。
这样,如果您添加更多用户,您只需将他们放在正确的组中即可向他们提供访问各个服务的权限。如果要创建新的配置文件,而不仅仅是Admin
和Normal
或特殊组,则只需创建一次并更新单个应用程序的配置以识别该组是否与之相关(请记住,用户可以是多个组的成员,因此您甚至不需要每个应用程序都知道每个组)。
我不知道您用于单点登录身份验证的机制。但是,出于微服务的精神和应用程序之间的最小共享,您实际上可以将组作为令牌中的作用域(例如,如果使用的是JWT)。这样,接收令牌的应用程序不仅知道用户已通过身份验证,而且甚至在不查询任何其他系统的情况下也知道用户组。
您将拥有的该体系结构如图所示。
每个用例(用@PreAuthorise
注释的服务方法)将起作用。
每个用户将与身份验证系统将提供的多个组相关联。 (例如,Active Directory中的组)。收到用户的身份验证信息后,这些组将映射到特定于应用程序的角色,并填充在UserDetails
Spring Security对象中。每个带注释的方法将获得应用程序特定的角色(而不是全局组)。
这使您可以灵活地添加任意多个具有相同应用程序角色的组。
答案 1 :(得分:0)
定义您自己的服务以管理用户/项目/角色的访问,并直接在您的@PreAUthorize上调用此服务。