Apexクラスの処理は基本的にシステム権限で実行されます。そのためいくつか権限設定を行い正しく利用されるように制御する必要があります。
ページアクセスの権限
この権限が付与されていない場合はページにアクセスするとエラーメッセージが表示されます。
有効なApexクラスの権限
Apexクラスの権限が実は付与されていなくてもあまり問題がないことが多いです。
社内ユーザが操作するVisualforceページが裏側で呼び出しているcontrollerなどは権限を付与していなくても問題なく利用できます。(@RemoteActionも平気でした。)
この権限が必要になるのはカスタムボタンからApexクラスを実行するWebServiceメソッドを呼び出すような場面で必要になります。(カスタムボタン→Javascript→Apexクラス呼び出しはLightning Experienceではサポートされていないので利用場面は少なくなったと思います。)
その他いくつかの場面で必要になったとは思いますが基本的には実装後の動作確認で気づけるレベルと思います。
オブジェクトの参照権限
Apexは基本的にシステム権限で実行されます。そのため項目レベルセキュリティなどは無視して処理が可能です。例として下記のような感じ。
権限あり
権限なし
このように取引先権限を除外することで標準ページでアクセスできなくしてもVisuaforceページでクエリを実行すると下記のようにデータにアクセスできます。
Visualforceページ側でapex:outputFieldタグなどをつかった場合は権限周りもチェックされますが、それ以外の表示方法なら権限を無視して実装できます。こうした仕様のメリットとしては、プロファイル設定でユーザの権限を与えないことで標準ページ上は何も操作できない状態にして、Visualforce一画面のみ業務に必要なデータ登録を行うなどの実装ができます。(上記取引先検索の例ではデータ参照ですが、基本的にはデータ登録や更新周りでの用途となると思います。)
逆に開発者はセキュリティの要件が厳しい機能のApex開発を行う場合はそうした判定処理を実装する必要があります。(基本的にアクセス権限を無視した機能の実装を行うケースの方が稀だと思いますが..)
「with sharing」と「without sharing」
よく話にでてくる「with sharing」と「without sharing」での取得制御ですが、こちらは項目レベルセキュリティを判定するのではなく、共有設定で制御された非公開レコードへのアクセスの制御となります。
まとめ
Apexのシステム権限実行ですが、Summer'19へのリリースでFLSやCRUDが考慮されるようになる機能が追加されるという話を耳にしました。(パイロット版かも) リリースノートなどではまだ正確な情報を確認していないのですが、Sandbox組織でSummer'19が一足先にさわれるようになっていると思いますので気になる機能の動作確認はしておいたほうが良いかもしれません。(パイロット版とのことなのでまだ大丈夫と思いますが。)