2014-10-27 3 views
1

Моего конфиг пружинной безопасности:Spring Security не выбрасывает никаких исключений

<security:http auto-config="true" use-expressions="true" > 
<security:intercept-url pattern="/game/**" access="isAuthenticated()"/> 
<security:intercept-url pattern="/**" access="permitAll"/> 

<security:form-login password-parameter="password" username-parameter="username" login-page="/" 
      default-target-url="/game/" login-processing-url="/processLogin" authentication-failure-url="/"/> 
<security:logout logout-url="/game/logout" logout-success-url="/" delete-cookies="true" invalidate-session="true"/> 
<security:access-denied-handler ref="accessDeniedHandler" /> 
</security:http> 

пользовательского обработчик:

@Component 
public class AccessDeniedHandler extends AccessDeniedHandlerImpl { 
@Override 
public void handle(HttpServletRequest request, 
        HttpServletResponse response, AccessDeniedException exception) 
     throws IOException, ServletException { 
    super.handle(request, response, exception); 
    } 
} 

Исключения распознаватель:

<bean class="org.springframework.web.servlet.handler.SimpleMappingExceptionResolver"> 
    <property name="exceptionMappings"> 
     <props> 
      <prop key=".AccessDeniedException">accessDenied</prop> 
     </props> 
    </property> 
</bean> 

У меня есть проблема в том, что весна безопасность не бросает никаких исключений. Например, когда я ввожу защищенный URL-адрес, он перенаправляет меня на страницу входа. Если я удаляю страницу входа из конфигурации, она перенаправляет меня на весеннюю регистрационную форму по умолчанию. Из-за этого я не могу обрабатывать такие исключения, как AccessDeniedException. Как вы можете видеть выше, я определил обработчик запрещенного доступа, который переопределяет метод дескриптора, но он даже не входит в него. Я также пробовал с SimpleMappingExceptionResolver, но это тоже не работает. Итак, мой вопрос: как мне сделать исключения для исключения Spring, чтобы я мог их поймать либо с помощью распознавателя, либо с помощью специального обработчика?

+0

'AccessDeniedHandler' применяется только к аутентифицированным пользователям. Возможно, если вы более подробно объясните, чего вы пытаетесь достичь. Почему бы вам не попробовать Spring Security для аутентификации пользователей, например? –

+0

Привет, Лука, спасибо за информацию. Не знал, что это относится только к аутентифицированному пользователю. То, что я пытаюсь сделать, - это просто отобразить мою страницу с ошибкой, когда пользователь, не прошедший проверку подлинности, пытается получить доступ к материалам только для прошедших проверку подлинности пользователей, но не сопоставляя их с каким-либо URL-адресом, чтобы пользователи не могли вручную вводить/отклонять, например. – Sikor

+0

Неясно, как пользователи на самом деле аутентифицированы или почему вы не хотите, чтобы они были, когда они обращаются к сайту. Если вы хотите переопределить процесс аутентификации для отказа в доступе, вы можете использовать пользовательский 'AuthenticationEntryPoint'. Значение по умолчанию будет перенаправлено на страницу входа. Также не используйте 'auto-config'. Он создаст настройку входа, независимо от того, сконфигурируйте ее или нет. Просто удалите его. –

ответ

2

Причина, по которой мой AccessDeniedHandler не работает, заключается в том, что он применяется только к аутентифицированным пользователям, поэтому для отображения страницы ошибки, когда пользователь, не прошедший проверку подлинности, пытается получить доступ к материалам только для прошедших проверку подлинности пользователей (это было целью попытки поймать AccessDeniedException), вы должны написать свою пользовательскую точку ввода и переопределить значение по умолчанию.

Luke Taylor для уточнения этого для меня.