0

我一直在努力解决这个问题。我想ActionBeanshowupdate动作使用相同的条纹。但是,我无法弄清楚如何以一种干净的方式来执行此操作,以允许当前用户对对象所有权进行可靠的绑定、验证和验证。

例如,假设我们的动作 bean 需要一个postingId. 该帖子属于已登录的用户。我们可能有这样的事情:

@UrlBinding("/posting/{postingId}")
@RolesAllowed({ "USER" })
public class PostingActionBean extends BaseActionBean

现在,对于show动作,我们可以定义:

    private int postingId; // assume the parameter in @UrlBinding above was renamed
    private Posting posting;

现在用于@After(stages = LifecycleStage.BindingAndValidation)获取Posting. 我们的@After函数可以验证当前登录的用户是否拥有该帖子。我们必须使用@After, not @Before,因为postingId不会事先绑定到参数。

但是,对于update函数,您希望使用, not将Posting对象绑定到 Posting 变量,以便将返回的表单条目应用到现有 Posting 对象之上,而不是应用到空存根上。@Before@After

自定义TypeConverter<T>在这里可以很好地工作,但是由于无法从TypeConverter界面获得会话,因此很难在绑定期间验证对象的所有权。

我能看到的唯一解决方案是使用两个单独的操作 bean,一个用于显示,一个用于更新。但是,如果您这样做,则<stripes:form>标记及其下游标记将无法正确填充表单的值,因为beanclassoraction标记必须映射回相同的ActionBean.

据我所知,Stripes 模型仅在操作简单(无 POJO)参数时才能保持在一起。在任何其他情况下,您似乎遇到了从数据存储中绑定对象并用客户端发送的更新覆盖它的问题 22。

我一定是错过了什么。经验丰富的 Stripes 用户的最佳实践是什么?

4

1 回答 1

1

在我看来,授权与物体水合是正交的。我的意思是,您应该将对象水合(在这种情况下,使用 apostingId并将其转换为 a Posting)与确定用户是否有权对该对象执行操作(如显示、更新、删除等)分开.,)。

对于对象水合,我使用 a TypeConverter<T>,并且我在不考虑会话用户的情况下对对象进行水合。然后在我的内部,我ActionBean在二传手周围有一个警卫,因此...

public void setPosting(Posting posting) {
    if (accessible(posting)) this.posting = posting;
}

哪里accessible(posting)看起来像这样......

private boolean accessible(Posting posting) {
    return authorisationChecker.isAuthorised(whoAmI(), posting);
}

然后你的show()事件方法看起来像这样......

public Resolution show() {
    if (posting == null) return NOT_FOUND; 
    return new ForwardResolution("/WEB-INF/jsp/posting.jsp");
}

另外,当我使用 Stripes 时,我经常在同一个 Stripes 中有多个事件(如“显示”或“更新”)ActionBean。对我来说,围绕相关名词对操作(动词)进行分组是有意义的。

使用干净的 URL,您的ActionBean注释将如下所示...

@UrlBinding("/posting/{$event}/{posting}")
@RolesAllowed({ "USER" })
public class PostingActionBean extends BaseActionBean

...{$event}您的事件方法的名称在哪里(即“显示”或“更新”)。请注意,我使用的是{posting},而不是{postingId}

为了完整起见,您的update()事件方法可能如下所示......

public Resolution update() {
    if (posting == null) throw new UnauthorisedAccessException();
    postingService.saveOrUpdate(posting);
    message("posting.save.confirmation");
    return new RedirectResolution(PostingsAction.class);
}
于 2013-01-15T00:15:43.807 回答