【问题标题】:Custom method within spring @Preauthorizespring @Preauthorize 中的自定义方法
【发布时间】:2014-09-13 18:32:16
【问题描述】:

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

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

我认为有两种方法:

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

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

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

然后做一些类似的事情:

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

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

【问题讨论】:

标签: java spring spring-security


【解决方案1】:

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

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

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

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

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

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

【讨论】:

    猜你喜欢
    • 2014-05-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-01-11
    • 1970-01-01
    • 2018-01-08
    • 2013-08-30
    • 2016-01-22
    相关资源
    最近更新 更多