0

私はしばらくの間この問題に取り組んできました。とアクションに同じストライプActionBeanを使用したいと思います。ただし、現在のユーザーによるオブジェクトの所有権の信頼性の高いバインド、妥当性確認、および検証を可能にするクリーンな方法でこれを行う方法を理解できませんでした。showupdate

たとえば、アクション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ではなく、を使用する必要があります。@BeforepostingId

ただし、関数の場合、返されたフォームエントリが空のスタブではなく、既存のPostingオブジェクトの上に適用されるように、ではなく、を使用してオブジェクトをPosting変数updateにバインドする必要があります。Posting@Before@After

ここではカスタムTypeConverter<T>が適切に機能しますが、セッションはTypeConverterインターフェイスから利用できないため、バインド中にオブジェクトの所有権を検証することは困難です。

私が見ることができる唯一の解決策は、2つの別々のアクションBeanを使用することです。1つはshow用で、もう1つはupdate用です。ただし、これを行うと、またはタグを同じにマップし直す必要が<stripes:form>あるため、タグとそのダウンストリームタグはフォームの値に正しく入力されません。beanclassactionActionBean

私が見る限り、Stripesモデルは、単純な(POJOなしの)パラメーターを操作する場合にのみ保持されます。それ以外の場合は、データストアからオブジェクトをバインドし、クライアントから送信された更新でオブジェクトを上書きするというキャッチ22に遭遇したようです。

私は何かが欠けている必要があります。経験豊富なStripesユーザーからのベストプラクティスは何ですか?

4

1 に答える 1

1

私の意見では、承認はオブジェクトの水和と直交しています。つまり、オブジェクトのハイドレーション(この場合は、を使用してpostingIdそれをに変換するPosting)の懸念を、ユーザーがそのオブジェクトに対して操作(表示、更新、削除など)を実行する権限を持っているかどうかを判断することから切り離す必要があります。 。、)。

オブジェクトのハイドレーションには、を使用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内に複数のイベント(「show」や「update」など)が発生することがよくありますActionBean。私にとっては、関連する名詞の周りに操作(動詞)をグループ化することは理にかなっています。

クリーンURLを使用すると、ActionBeanアノテーションは次のようになります...

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

...{$event}イベントメソッドの名前はどこにありますか(つまり、「show」または「update」)。{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 に答える