2012-07-22 2 views
0

내가 내 응용 프로그램에 액세스 페이지에이 규칙이 실패) 액세스가 실패하면 컨트롤러에서이 이벤트를 처리합니다.차단 - URL 접속 후 특정 URL로 리디렉션은

@RequestMapping(value = "/access-denied", method = RequestMethod.GET) 
    public String accessDenied(Model model, RedirectAttributes ra) { 

    // do what I want 

    return "redirect:login"; 
} 

예를 들어 사용자가/upload를 입력하고 로그인하지 않았으므로/access-denied로 리디렉션됩니다.

답변

2

리디렉션을해야하는 이유를 설명하는 데 도움이 될 것입니다. 스프링 보안이이를 자동으로 수행 할 것이기 때문입니다. 액세스가 거부되면 인증되지 않은 사용자의 기본 동작은 사용자가 원하는 것으로 보이는 로그인 페이지로 리디렉션하는 것입니다.

프로세스를 사용자 지정하려는 경우 사용되는 전략은 컨트롤러를 사용하는 것보다이 기능을 구현하는 것이 더 바람직합니다. 나는 이것에 대해 더 많은 것을 a previous answer에 썼다.

추가 기능을 추가하려면 LoginUrlAuthenticationEntryPoint을 확장하고 commence 메서드를 재정의하고 수퍼 클래스를 호출하여 리디렉션을 수행 할 수 있습니다.

즉, namespace 요소의 login-page 값은 사용되지 않습니다. 생성자에서 LoginUrlAuthenticationEntryPoint에 대한 로그인 URL을 설정해야합니다.

+0

예, 스프링 보안은 자동으로 로그인 페이지로 리디렉션됩니다. 로그인 페이지에 로그인 메시지가 표시되도록 플래시 메시지를 표시하고 싶습니다. 리디렉션 된 페이지에 플래시 메시지를 표시하려면 RedirectAttributes를 사용할 수 있습니다. 예 : ra.addFlashAttribute ("errorMsg", "로그인하지 않았습니다."); return "redirect : login"; –

+0

글쎄요, 스프링 시큐리티는 실제로 스프링 MVC에 대해 아무것도 모르기 때문에, 당신은'AuthenticationEntryPoint'에서 이것을 할 수 없습니다. 더블 리디렉션 (컨트롤러에서 먼저, 그리고 로그인 페이지로)을 할 수 있으며, 실제로 사용하도록 설정되어 있다면 플래시 범위 설정을 직접 조작 할 수 있습니다. 또는 리디렉션 URL에 매개 변수를 추가하는 등의 간단한 방법으로 오류 메시지를 설정할 수 있습니다. –

+0

감사합니다. 작동해야합니다. –

0

다음 코드에서는 access-denied-page 특성이 security-http입니다.

<security:global-method-security 
      pre-post-annotations="enabled" /> 
    <security:http auto-config="false" use-expressions="true" 
      disable-url-rewriting="true" entry-point-ref="loginUrlAuthenticationEntryPoint" 
      access-denied-page="/access-denied"> 
     <security:intercept-url pattern="/someurl" 
       access="isAuthenticated()" /> 
</security:http> 
관련 문제