Я получил это на работу. Мне пришлось иметь дело с парой вещей.
Во-первых, в моей конфигурации Spring MVC был настроен SimpleMappingExceptionResolver с настройкой defaultErrorView. Это перехватывало ошибки аутентификации и авторизации, прежде чем они могли добраться до обработчика отказа в доступе, который я настроил в элементе http в моей конфигурации безопасности. Окончательный код выглядит примерно так.
securitycontext.xml
<global-method-security pre-post-annotations="enabled"/>
<!-- HTTP security configurations -->
<http auto-config="false" use-expressions="true" entry-point-ref="loginUrlAuthenticationEntryPoint">
<access-denied-handler ref="myAccessDeniedHandler" />
... other configuration here ...
</http>
<!-- handler for authorization failure. Will redirect to the login page. -->
<beans:bean id="myAccessDeniedHandler" class="org.springframework.security.web.access.AccessDeniedHandlerImpl">
<beans:property name="errorPage" value="/index" />
</beans:bean>
обратите внимание, что loginUrlAuthenticationEntryPoint на самом деле не является частью решения, это обработчик отказа в доступе.
В моем mvc-config.xml все еще есть SimpleMappingExceptionResolver, но без настроенного defaultErrorView. Если бы я продолжил этот путь, я бы, вероятно, реализовал свой собственный SimpleMappingExceptionResolver, который позволял бы пропускать исключения аутентификации и авторизации, ИЛИ настраивал его вместо этого в SimpleMappingExceptionResolver.
Убийство в этой сделке заключается в том, что я не нашел способа настроить require-channel = "https" из intercept-url через аннотацию, поэтому я сейчас положу его в файл конфигурации xml в любом случае.