9

春のセキュリティは初めてです。これをどのように解釈すればよいですか?

 @PreAuthorize("hasPermission(null, 'opetussuunnitelma', 'LUONTI')")
     OpetussuunnitelmaDto addOpetussuunnitelma(OpetussuunnitelmaDto opetussuunnitelmaDto);

パーミッション エバリュエーターのどのメソッドが呼び出されるでしょうか? この場合、3つのパラメーターを持つものが呼び出されると思います。現在のユーザーがタイプ「opetussuunnitelma」のターゲットに対する「LUONTI」権限を持っているかどうかを確認しています。私は正しいですか?「null」を含めずに、2 つのパラメーターのみを渡すことはできませんか。最初の引数 ( Authentication オブジェクト) が指定されていないことを読みました。

+public class PermissionEvaluator implements org.springframework.security.access.PermissionEvaluator {
+
+    @Override
+    public boolean hasPermission(Authentication authentication, Object targetDomainObject, Object permission) {
+        LOG.error(" *** ei toteutettu *** ");
+        return true;
+    }
+
+    @Override
+    public boolean hasPermission(Authentication authentication, Serializable targetId, String targetType, Object permission) {
+        LOG.error(" *** ei toteutettu *** ");
+        return true;
+    }
+
+    private static final Logger LOG = LoggerFactory.getLogger(PermissionEvaluator.class);
+}
4

2 に答える 2

14

パーミッション エバリュエーターのどのメソッドが呼び出されるでしょうか?

public boolean hasPermission(Authentication authentication, Object targetDomainObject, Object permission) 

呼ばれるでしょう。

最初の引数 ( Authentication オブジェクト) が指定されていないことを読みました。

アノテーションで明示的に提供されるのではなく、Spring によって暗黙的に提供されます。あなたの注釈はただ読むべきです

@PreAuthorize("hasPermission(#opetussuunnitelmaDto, 'LUONTI')")

理想的には、承認を実行する前に、それらが認証されているかどうかを確認します。

@PreAuthorize("isAuthenticated() and hasPermission(#opetussuunnitelmaDto, 'LUONTI')")

コメントを更新する

基本的に、次のいずれかで PermissionEvaluator を呼び出すことができます。

hasPermission('#targetDomainObject', 'permission')    // method1
hasPermission('targetId', 'targetType', 'permission') // method2

認証は常に Spring によって提供されます。あなたの場合、次の方法で hasPermission を呼び出しています

hasPermission(null, 'opetussuunnitelma', 'LUONTI')")

これはmethod2と一致しますが、null id を渡すのは意味がありません。権限チェックの対象となるエンティティは何ですか? @PreAuthorize を適用しているメソッドに基づいて、

OpetussuunnitelmaDto addOpetussuunnitelma(OpetussuunnitelmaDto opetussuunnitelmaDto);

ターゲット ドメイン オブジェクトに似たものがあるように見えるので、method1を呼び出す方が理にかなっています。

于 2015-06-24T18:08:41.987 に答える