1

私はSpring Securityも使用してSpring MVC webappを開発しています。

ログに記録されたユーザーと現在アクセスしているエンティティに基づいて、ユーザーがそれを表示または変更することを許可または拒否する必要があります。ユーザーがエンティティを作成した場合、そのユーザーは所有者であり、エンティティを処理できます。entity.user == user であるため、確認できます。

エンティティの親、または n-parent を取得することによってのみユーザーを比較できる状況もあります。例 entity.nestedEntity.user == user

Spring Security が ACL をサポートしている (ドメイン オブジェクト セキュリティ) ことを見てきましたが、「親シナリオ」を処理できないと思います。そして、私は空のデータベースから始めていません。さらに、オブジェクトごとに acl を作成する必要があると思うので、適切な方法ではないと思います。

ここまでで、現在のユーザーを取得し、要求されたオブジェクトに格納されているユーザーと比較して、コントローラー レイヤーでチェックインを行います。それらが同じでない場合、AccessDeniedException をスローします。

物事をできるだけシンプルに保つために、どのような代替アプローチを取ることができますか?

ありがとうマルコ

4

1 に答える 1

6

カスタム許可ロジックをチェックする独自の PermissionEvaluator を実装できます。次に、新しく作成した PermissionEvaluator を Spring Security に登録すると、Spring Security アノテーションでカスタム権限チェックを使用できます。

最小限の例 (春のセキュリティ構成):

<!-- Enable usage of @Pre & @Post security annotations -->
<global-method-security secured-annotations="enabled"  pre-post-annotations="enabled">
      <expression-handler ref="expressionHandler"/>
</global-method-security>

<!-- Use CustomPermissionEvaluator as permission evaluator to control access to    application with specific permission rules -->
<beans:bean id="expressionHandler" class="org.springframework.security.access.expression.method.DefaultMethodSecurityExpressionHandler">
     <beans:property name="permissionEvaluator" ref="customPermissionEvaluator"/>
</beans:bean>

<beans:bean id="customPermissionEvaluator" class="com.example.CustomPermissionEvaluator">

次に、CustomPermissionEvalutor には、カスタムの「OWNER」権限とカスタム ドメイン オブジェクトの権限チェックを行う hasPermission 実装が必要です。

このようなもの:

@Override
public boolean hasPermission(Authentication authentication, Object targetDomainObject, Object permission) {
    ...
    if ("OWNER".equals(permission.toString()) && targetDomainObject instanceof Entity) {
         //fetch user from Authentication and verify if user is owner of Entity
    }
    ...
}

最後に、アノテーションを使用してセキュリティを強化できます。

@PreAuthorize("hasPermission(#someEntity, 'OWNER')")
public someMethod(Entity someEntity) { ... }

Spring Security アノテーションで評価できる新しい関数を追加することもできます (ただし、より複雑です)。その場合、独自の isOwner 関数を追加でき、PreAuthorize は @PreAuthorize('isOwner(#someEntity)') のようになります。 ..

于 2013-07-10T16:25:43.760 に答える