From what i understand the std random accessed iterator allows u to exceed the array.
Not quite; you can't access anything outside the container, and trying to do so will give undefined behaviour. But the iterator is not required to prevent you from trying to access invalid memory.
The reason is that there could be a significant runtime cost to checking the range; by not requiring this, you can have the choice between a fast implementation that requires you to design your access patterns correctly, or a slow, safer implementation that can detect some mistakes for you.
Does it allow to get the value it is holding over the Size? Does it allow the user to write over that memory?
It might detect that and report an error; or it might not, and allow you to access invalid memory with undefined results.
And for my implementation, should i allow access over the Size?
No, it makes no sense to allow it. You can choose whether to actively prevent it by checking access at runtime, or to passively prevent it by documenting that it's the user's responsibility to make sure the iterator remains valid.
what is considered good programming in this case?
An unchecked iterator is simpler and doesn't add any, perhaps unwanted, performance costs. You could provide checked iterators as well; either separately or as wrappers around the unchecked ones, to give the user the choice of how fast or safe they want it.