spring @Preauthorize中的自定义方法

时间:2014-07-22 19:13:40

标签: java spring spring-security

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

@PreAuthorize("customAllowThis()")
public void foo() { }

我认为有两种方法:

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

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

@Component
public class AuthorisationService {
    public boolean allowThis() {
         return true;
    }
}

并执行以下操作:

@PreAuthorize("@authorisationService.customAllowThis()")
public void foo() { }

我更喜欢方法2,虽然它看起来像它会绕过"自然顺序"春天在如何处理这种情况方面是否有任何良好/最佳实践?关键是我不想将所有特定的方法都放在一个班级中,但从另一方面我不想做某事"脏"。

1 个答案:

答案 0 :(得分:0)

要实现此目的,您可以执行以下操作:

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

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

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

    @PreAuthorize(“ myServiceClass.hasRoles(#roles)”)

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