コントローラに追加@With(Secure.class)
すると、認証されていないアクセスがすべてブロックされます。特定のアクションに対してのみ有効にする方法、またはコントローラーで有効にした後に特定のアクションを除外する方法はありますか?
5 に答える
セキュア モジュールではそれができません。Niels が言ったように、セキュア モジュールはソリューションというよりは例です。@Before アノテーションを使用して、独自のセキュリティ システムを構築できます。次に例を示します。
public class Admin extends Controller {
@Before(unless={"login", "authenticate", "logout", "otherMethod"})
void checkAccess() {
// check the cookie
}
public void login() {
render();
}
public void authenticate(String email, String password) {
// check the params and set a value in the cookie
}
public void logout() {
// delete cookie
}
セキュア モジュールのソース コードを読むことをお勧めします。
@Public
それ以来、継承されたアクションに対処できないため、以前のソリューションはやや制限的であることがわかりました。代わりに、クラス レベルの注釈に移動しました。
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.TYPE)
public @interface AllowGuest {
String[] value();
}
Secure.checkAccess()
メソッドの先頭に次のコードを追加しました。
AllowGuest guest = getControllerInheritedAnnotation(AllowGuest.class);
if (guest != null) {
for (String action : guest.value()) {
if (action.equals(request.actionMethod))
return;
}
}
次のように使用できます。@AllowGuest({"list","view"})
これにより、ローカルおよび継承されたアクションへのアクセスを許可し、コントローラー内のどのアクションが保護されていないかを簡単に確認できます。
コントローラーへの注釈を削除@With(Secure.class)
し、コントローラー内にこのコードを追加します。
@Before(unless={"show"})
static void checkAccess() throws Throwable {
Secure.checkAccess();
}
show
公開する必要があるアクションはどこにありますか。
探していたものを取得するために、Check
注釈をコピーして作成しましたPublic
。
package controllers;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
@Retention(RetentionPolicy.RUNTIME)
@Target({ElementType.METHOD})
public @interface Public {
}
Secure.checkAccess
次に、これらの2行を:の先頭に追加しました。
if (getActionAnnotation(Public.class) != null)
return;
を使用するコントローラーのアクションに注釈をWith(Secure.class)
追加することで、ログインせずにアクセスできるようになりました。@Public
Secure Controller の @Before-Tag で値を設定しない限り、またはのみ設定できます。Secure-Module は、ソリューションというよりは例です。