spring @Preauthorize 中的自定义方法

Tak*_*aks 5 java spring spring-security

我正在实施一个应用程序,该应用程序具有一些访问完全基于权限的方法。权限是使用 Spring 实现的。使用@PreAuthorize注释在方法之上添加权限。问题是我希望在注释中有完全自定义的方法 (EL)。所以我想实现的是:

@PreAuthorize("customAllowThis()")
public void foo() { }
Run Code Online (Sandbox Code Playgroud)

我认为有两种方法:

方法 1:尝试覆盖SecurityExpressionRoot并在那里添加我的自定义方法。我将在不同的方法上使用多个授权服务,因此将所有特定方法都放在 SecurityExpressionRoot 中会造成很大的混乱。

方法 2:创建服务并将方法放在那里:

@Component
public class AuthorisationService {
    public boolean allowThis() {
         return true;
    }
}
Run Code Online (Sandbox Code Playgroud)

并执行以下操作:

@PreAuthorize("@authorisationService.customAllowThis()")
public void foo() { }
Run Code Online (Sandbox Code Playgroud)

我更喜欢方法 2,尽管它看起来像绕过 Spring 的“自然顺序”。在如何处理这种情况方面是否有任何好的/最佳做法?关键是我不想将所有特定方法都放在一个类中,但另一方面我不想做一些“肮脏”的事情。

小智 2

为此,您可以执行以下操作:

  1. 创建一个接受一系列允许的角色的自定义注释,如下所示:

    @Allows({RoleEnum.ROLE1, RoleEnum.ROLE2 })

  2. 使用 SPeL,我们可以调用一个自定义方法来检查用户是否具有这些角色,如下所示:

    @PreAuthorize("myServiceClass.hasRoles(#roles)")

  3. 在服务类中,您只需根据 OAuth 数据库中的角色验证用户角色,并在服务中执行任何业务逻辑。