式ベースの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)
です。
理由がわかりません。どんな助けでもいただければ幸いです。