Ger*_*rdo 10 spring-security spring-data spring-data-rest
我正在使用Spring Data Rest来公开存储库.我正在使用@PreAuthorize并@PostFilter限制对REST端点的访问,以专门管理用户并过滤结果.
@PreAuthorize("hasRole('ROLE_ADMIN')")
@PostFilter("hasPermission(filterObject, 'read')
public interface SomeRepository extends CrudRepository<SomeEntity, Long> {
}
Run Code Online (Sandbox Code Playgroud)
与此同时,我有另一个不需要任何身份验证但使用存储库的Controller.
@Controller
public class SomeController {
@Autowired
SomeRepository repository;
@RequestMapping(value = "/test")
public ResponseEntity test () {
// Do something
repository.findAll();
// Do something else
}
}
Run Code Online (Sandbox Code Playgroud)
这不起作用,因为将请求发送到"/ test"的用户不是admin,因此它无权访问存储库.
我的问题是,可以将安全性专门添加到存储库的REST接口,而不是在应用程序内部使用存储库时?
谢谢
请评估以下可能性:
RunAsManager(或临时切换SecurityContext来执行特权操作)使用REST事件处理程序确保修改请求的安全:
@Service
@RepositoryEventHandler
public class FooService {
/**
* Handles before-* events.
*/
@HandleBeforeCreate
@HandleBeforeSave
@HandleBeforeDelete
@HandleBeforeLinkSave
@HandleBeforeLinkDelete
@PreAuthorize("hasRole('ADMIN')")
public void onBeforeModify(final Foo entity){
// noop
}
}
Run Code Online (Sandbox Code Playgroud)
保护标准CRUD方法,同时在存储库中添加供内部使用的非安全自定义方法:
public interface FooDao extends CrudRepository<Foo, Long> {
@Override
@PreAuthorize("hasRole('ADMIN')")
<S extends Foo> S save(final S entity);
/**
* Saves entity without security checks.
*/
@Transactional
@Modifying
default <S extends Foo> S saveInternal(final S entity) {
return save(entity);
}
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
2403 次 |
| 最近记录: |