3

Deadbolt のモジュールを使用すると、restrictedResource をビュー内のリソース名とパラメーターで確認できます。

たとえば、私の見解では、私はそれを持っており、うまく機能します:

#{deadbolt.restrictedResource resourceKeys:['Domain'] , resourceParameters:['domainid':domain.id]}
   <li><a href="@{Admin.showDomain(domain.id)}">${domain.title}</a></li>
#{/deadbolt.restrictedResource}

しかし、私のコントローラーでは、リソース名を確認することしかできませんが、ドメイン ID を渡す RestrictedResourcesHandler でそれを確認する方法が見つかりません。

私はそのようなことをするための解決策を探しています:

@RestrictedResource(name = {"Domain"}, params = {domainid})
public static void showDomain(String domainid)
{
}

前もって感謝します

4

2 に答える 2

4

アノテーションに動的な情報を含めることはできませんが、params を使用して、リクエスト内の着信値の名前を定義できます。ただし、この情報はマップを想定しているため、現時点ではハンドラーに渡されません。RestrictedResource タグからパラメーターのマップを渡すことはできますが、アノテーションからこれを行うことはできないため、空のマップがハンドラーに渡されます。

ここでの最善のアプローチは、リクエスト オブジェクトから既知のパラメーター名を取得することです。後方互換性を損なうことなくこれを行う最善の方法について再考する必要があります。

スティーブ (デッドボルトの作者)

于 2012-07-25T07:55:45.667 に答える
1

問題を解決する方法を見つけましたが、私が思うに最善ではありませんが、それは Steve Chaloner の解決策 (Deadbolt の作成者) であり、機能します。

たとえば、コントローラーのメソッド引数の名前が「id」で、checkAccess メソッド内でこの id を確認したい場合:

// Controller's method : 
@RestrictedResource(name = {"Domain"})
public static void showDomain(String id){} 

checkAccess メソッドの先頭で Map "resourceParameters" が空であることを確認し、リクエスト オブジェクトを使用してパラメーターを取得します。

public AccessResult checkAccess(List<String> resourceNames,
                                Map<String, String> resourceParameters)
{    
    Map<String, String> hashm = new HashMap<String,String>();

    if(resourceParameters != null && !resourceParameters.isEmpty()){
        hashm = resourceParameters;
    }else if(Http.Request.current().routeArgs!= null && !Http.Request.current().routeArgs.isEmpty()){
        hashm = Http.Request.current().routeArgs;
    }
}

次に、 checkAccess メソッド内でハッシュマップを foreach するだけで、コントローラーのメソッド引数を取得し、必要に応じてアクセスを確認できます。

for (Map.Entry<String,String> mp : hashm.entrySet())
{
    // Get the id argument
    if(mp.getKey().equals("id"))
    {
        // Do something with the value..
        mp.getValue()
    }        
}
于 2012-08-17T12:38:48.563 に答える