【问题标题】:Securing Methods with Spring Security使用 Spring Security 保护方法
【发布时间】:2011-08-08 20:53:56
【问题描述】:

对于我们当前的项目,我们正在集成 JSF 和 Spring 框架。我想使用 Spring Security 来处理身份验证和授权。到目前为止,我已经实现了一个自定义的PasswordEncoder 和AccessDecisionVoter,它们工作正常。现在我正在尝试使用 @Secured 注释(以及其他)来保护方法,但我无法让它像我期望的那样工作。

似乎@Secured 注释仅适用于直接从 JSF 层调用的 bean 方法。这是一个简化的示例:

@Named("foobarBean")
@Scope("access")
public class FoobarBean
{
    @Secured("PERMISSION_TWO")
    public void dummy()
    {
    }

    @Secured("PERMISSION_ONE")
    public String save()
    {
        dummy();
    }
}

从 JSF 层调用方法 save(),如下所示:

<h:commandButton id="save" action="#{foobarBean.save}" />

然后我们的AccessDecisionVoter 被要求对 PERMISSION_ONE 进行投票,但不对 PERMISSION_TWO 进行投票。这是按设计工作(我希望不是)还是我做错了什么(可能是什么?)。

我会发布更多代码或配置,但我不确定哪一部分是相关的,我不想让这篇文章变得混乱。

【问题讨论】:

    标签: java spring jsf spring-security


    【解决方案1】:

    这是一个简单的Proxy AOP问题!如果您使用 Proxy AOP for Security,那么 Proxy 只能拦截通过代理的调用。如果一个方法直接调用同一个 bean 的另一个方法,那么没有代理可以拦截这个调用。 -- 这就是为什么只考虑save()的安全注解的原因。

    一种解决方案是使用 AspectJ AOP 而不是代理 AOP。 (Spring(Security)也支持它。)

    【讨论】:

      【解决方案2】:

      是的,AccessDecisionVoter 就是这样工作的。它采用资源上允许的所有角色(在您的情况下为方法),并从当前经过身份验证的用户的角色中为这些角色投票。如果角色匹配,则仅授予权限。

      在您的情况下,为save 方法定义的唯一角色是PERMISSION_ONE,因此安全系统将仅检查此角色。如果登录用户具有该角色,则会执行此方法。

      【讨论】:

      • 好的,我明白了,我可以调用 save() 方法。但是 save() 然后调用 dummy() 这也是一种安全方法。我希望在方法 dummy() 被方法 save() 调用时检查所需的权限...
      猜你喜欢
      • 2013-06-25
      • 2014-07-29
      • 2022-12-11
      • 2014-02-21
      • 2016-09-01
      • 1970-01-01
      • 1970-01-01
      • 2014-10-10
      相关资源
      最近更新 更多