1

式ベースのSpringSecurity3.xでアプリケーションを保護しています。私は次のサービスインターフェースを持っています:

@PreAuthorize("hasRole('ROLE_ADMIN') or hasPermission(#employeeId, 'employee', 'isOwner')")
EmployeeData getById(Integer employeeId);

@PreAuthorize("hasRole('ROLE_ADMIN') or hasPermission(#employeeId, 'employee', 'isOwner')")
void update(Integer employeeId, EmployeeData employeedata);

私のPermissionEvaluatorは次のようになります。

@Component
public class CustomPermissionEvaluator implements PermissionEvaluator {
    private Map<String, Permission> permissionMap = new HashMap<String, Permission>();

    public CustomPermissionEvaluator(Map<String, Permission> permissionMap) {
        this.permissionMap = permissionMap;
    }

    @Override
    public boolean hasPermission(Authentication authentication, Object targetDomainObject, Object permission) {
        throw new PermissionNotDefinedException("Permission not supported for loaded domain object by " + this.getClass().toString());
    }

    @Override
    public boolean hasPermission(Authentication authentication, Serializable targetId, String targetType, Object permission) {
        verifyPermissionIsDefined((String) permission);
        return permissionMap.get(permission).isAllowed(authentication, (Integer) targetId);
    }

    private void verifyPermissionIsDefined(String permissionKey) {
        if (!permissionMap.containsKey(permissionKey)) {
            throw new PermissionNotDefinedException("No permission with key '" + permissionKey + "' is defined in" + this.getClass().toString());
        }
    }
}

最初のサービスメソッド(getById)の場合、これは想定どおりに機能します。

  • ユーザーがROLE_ADMINを持っている場合、ユーザーはデータを取得できます。
  • ユーザーが自分のプロファイルを検索したい場合は、彼も許可されます

ただし、2番目の方法であるupdateメソッドの場合、アプリケーションは機能しません。targetIdは、メソッドを呼び出すときは常にnullhasPermission(Authentication authentication, Serializable targetId, String targetType, Object permission)です。

理由がわかりません。どんな助けでもいただければ幸いです。

4

2 に答える 2

3

パラメータ名がサービスと実装の両方で一致していることを確認してください。

MethodSecurityEvaluationContext.lookupVariableメソッドがデバッガーでどのように機能しているかを確認することもできます。

同様の質問を参照してください:スプリングセキュリティ:@PreAuthorizeでHibernateエンティティパラメータにアクセスできないのはなぜですか?

于 2012-09-07T11:48:21.733 に答える
0

私は同様の問題を抱えていました:targetDomainObjectはhasPermissionの呼び出しごとにnullでした。

私にとっての問題は、すべての認証アノテーションが設定されたインターフェースA(@PreAuthorizeや@PostAuthorizeなど)を持っていたことでした。それは抽象クラスBによって実装されました。そして具体的なクラスCが実際のサービスでした。

public class C extends B

これは機能しませんでした。

public class C extends B implements A

しかし、これはうまくいきました。

コードロジックから、これらの宣言は完全に同じでした。しかし、Springのセキュリティは最初のものを混乱させ
、2番目のものと正常に機能しました。

于 2015-01-09T19:29:03.947 に答える