使用弹簧安全保护方法



对于我们当前的项目,我们正在集成JSF和Spring框架。我想使用Spring Security来处理身份验证和授权。到目前为止,我已经实现了一个工作良好的自定义PasswordEncoderAccessDecisionVoter。现在我正试图使用@Secured注释(除其他外)来保护方法,但我不能像我期望的那样工作。

似乎@Secured注释只适用于直接从JSF层调用的bean方法。下面是一个简单的例子:

@Named("foobarBean")
@Scope("access")
public class FoobarBean
{
    @Secured("PERMISSION_TWO")
    public void dummy()
    {
    }
    @Secured("PERMISSION_ONE")
    public String save()
    {
        dummy();
    }
}
方法save()从JSF层调用,如下所示:
<h:commandButton id="save" action="#{foobarBean.save}" />
然后要求我们的AccessDecisionVoter在PERMISSION_ONE上投票,但在PERMISSION_TWO上投票的是而不是。这是按照设计工作的(我希望不是)还是我做错了什么(那会是什么?)

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

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

一个解决方案是使用AspectJ AOP代替Proxy AOP。(Spring (Security)也支持)

是的,这就是AccessDecisionVoter的工作原理。它接受资源(在您的例子中是方法)上允许的所有角色,并从当前经过身份验证的用户角色中投票选出这些角色。如果匹配Role,则只授予权限。

在您的例子中,为save方法定义的唯一角色是PERMISSION_ONE,因此安全系统将只检查此角色。如果已登录的用户具有该角色,则执行此方法。

相关内容

  • 没有找到相关文章

最新更新