Java 每个实体的Spring引导安全角色

Java 每个实体的Spring引导安全角色,java,spring-boot,spring-security,Java,Spring Boot,Spring Security,我的应用程序目前有两种类型的用户:Admin或Normal用户 该应用程序有几个项目:100个或更多。每个项目的用户都有不同的角色,如项目所有者、客户等 我现在正在想最好的办法把这些副作用放在适当的位置。 因为在我的服务中,我想使用预授权(“hasRole('OWNER')”),这样只有合适的人才能执行更新或其他任何操作 我现在尝试的是为每个项目提供一个用户列表,这些用户在使用角色(项目所有者、客户端等)进行工作。当我通过Spring Security登录时,我检索该用户并获取他所在的所有项目,

我的应用程序目前有两种类型的用户:AdminNormal用户

该应用程序有几个项目:100个或更多。每个项目的用户都有不同的角色,如项目所有者、客户等

我现在正在想最好的办法把这些副作用放在适当的位置。 因为在我的服务中,我想使用
预授权(“hasRole('OWNER')”)
,这样只有合适的人才能执行更新或其他任何操作

我现在尝试的是为每个项目提供一个用户列表,这些用户在使用角色(项目所有者、客户端等)进行工作。当我通过Spring Security登录时,我检索该用户并获取他所在的所有项目,然后我添加角色,如下所示
角色\u项目名称\u所有者
角色\u项目名称\u客户端


问题是我不能使用
HASROLE
,因为有很多项目,所以我不能预先注释哪些项目允许在我的服务层中进行方法调用。我也不能只添加
所有者
,因为这样我就不知道在哪个项目中。因此,我有点被困在这里如何正确地做到这一点。

为什么不将用户和他们所属的组与他们可以访问的角色和服务分开呢

有多种方法可以做到这一点,但一种方法是让中央身份验证框架在用户执行身份验证后为您提供用户组

现在,在每个服务中,都有组和角色之间的映射。角色是特定于应用程序的,身份验证服务或其他应用程序并不关心它们。您可以将此映射存储在单个应用程序的数据库中,或者存储在一个简单的配置文件中(可能只是存储在特定应用程序的
application.yaml

您的组目前是
Admin
Normal
,但您可以有其他组。用户也可以是多个组的成员。因此,在应用程序1中,可以说
Admin
用户可以执行角色1、角色2、角色3,而
Normal
用户只能执行
role 1
。这也是多对多。这是您的
UserDetails
实例在识别经过身份验证的用户及其组后将携带的内容,这些用户及其组将作为Spring安全配置的一部分映射到角色。然后,您将能够对您的服务进行
预授权(“hasRole('OWNER')”)

这样,如果您添加了更多用户,您只需将他们放入正确的组中,就可以让他们访问各个服务。如果您想创建新的配置文件,而不仅仅是
Admin
Normal
或特殊组,您只需执行一次,并更新单个应用程序的配置,以识别与该组相关的组(请记住,用户可以是多个组的成员,因此您甚至不需要每个应用程序都了解每个组)

我不知道您正在使用什么机制进行单点登录身份验证。但本着微服务和应用程序之间最小共享的精神,您实际上可以将组作为作用域放入令牌中(例如,如果您使用JWT)。这样,接收令牌的应用程序不仅知道用户已通过身份验证,而且知道用户的组,而无需向任何其他系统进行查询

您将拥有的架构如图所示

每个用例(用
@PreAuthorise
注释的服务方法)都有一个角色。 每个用户都将与身份验证系统提供的多个组相关联。(例如Active Directory中的组)。在收到用户的身份验证信息后,这些组将映射到特定于应用程序的角色,并填充到
UserDetails
Spring安全对象中。然后,每个带注释的方法将获得特定于应用程序的角色(而不是全局组)


这使您可以灵活地添加任意多个可以具有相同应用程序角色的组。

定义您自己的服务以管理用户/项目/角色的访问权限,并直接在@PreAUthorize上调用此服务


看看:

谢谢你的帮助。但我不知道这如何在项目中适用于不同的角色。我有一个项目a,我是所有者,然后是项目B,我只是一个客户。那工作如何?因为我不能把hasRole owner放在首位,因为它总是成功的,因为我有所有者角色,因为我是项目的所有者ct A?您必须为您拥有的不同配置文件创建一个不同的组。如果所有管理员用户都是项目A中的所有者,则您可以映射组管理员->角色所有者。如果管理员与项目A无关,则您必须创建一个新组“项目A所有者”。如果该组在应用程序之间存在更多交叉问题(如“高级经理”可以查看项目A、B和C的报告),您将有一个不同的组对每个项目的权限映射。因此,我将有一个所有者用户列表、projectManager用户列表等等,这就是您所说的组对吗?当我输入一个restcontroller并对我的服务执行一个方法时,我会检查经过身份验证的用户是否在所有者角色列表中,例如@PreAuthorise?是的。你真的可以随心所欲。你必须想一想,进行身份验证的系统是否需要了解100个或100多个系统中的每个系统,或者你是否可以根据业务流程对用户进行逻辑分组。因此,你的身份验证系统只是说用户给了我正确的密码,下面是他所在的组。100个系统中的每一个都可以说,如果用户是“销售代表”组的成员,那么我允许他担任这些角色以允许他执行这些操作。“销售代表”可以是一个跨系统的组,也可以不是。我添加了一个图表和一些解释。在我的c