对于我们当前的项目,我们正在集成 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();
}
}
save() 方法是从 JSF 层调用的,如下所示:
<h:commandButton id="save" action="#{foobarBean.save}" />
然后,我们的 AccessDecisionVoter
会被要求对 PERMISSION_ONE 进行投票,但不对 PERMISSION_TWO 进行投票。这是按设计工作的吗(我希望不是)还是我做错了什么(那可能是什么?)。
我会发布更多代码或配置,但我不确定哪一部分是相关的,而且我不想让这篇文章变得困惑。
最佳答案
这是一个简单的Proxy AOP问题!如果您使用代理 AOP 来确保安全,那么代理只能拦截通过代理的调用。如果一个方法直接调用同一 bean 的另一个方法,则没有代理可以拦截此调用。 -- 这就是为什么只考虑 save()
的安全注解的原因。
一种解决方案是使用 AspectJ AOP 而不是代理 AOP。 (Spring(安全)也支持它。)
关于java - 使用 Spring Security 保护方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6979788/