2016-11-23 67 views
0

我正在使用的Web應用程序使用Spring Security。我對其進行了配置,以便未授權的請求由其中一個控制器處理(使用access-denied-handler)。但是,當有人在登錄之前嘗試訪問一個頁面時,他發現自己在登錄頁面而沒有通過控制器。我想讓這個案例由上面提到的同一個控制器來處理。如何防止未經身份驗證的用戶在Spring Security中重定向登錄頁面?

已有similar question其中REST API請求由控制器處理,其餘請求被重定向到登錄頁面。這是使用兩個入口點實現的。我想要的是一個cotroller處理所有未經授權的/未經身份驗證的請求,無論是服務調用還是靜態頁面。所以,我不需要兩種不同的機制。我是否還需要配置入口點?我想應該有一個更簡單的方法來做到這一點。

這裏是我的安全配置大致是這樣的:

<http use-expressions="true" pattern="/**" authentication-manager-ref="operatorAuthenticationManager"> 
    <access-denied-handler error-page="/denied" /> 

    <intercept-url pattern="/order/**" access="hasAnyAuthority('ROLE_ADMIN','ROLE_OPERATOR')"/> 
    <intercept-url pattern="/client/**" access="hasAnyAuthority('ROLE_ADMIN')"/> 
    <intercept-url pattern="/denied" access="permitAll"/> 
    <intercept-url pattern="/login" access="permitAll"/> 
    <intercept-url pattern="/login.jsp" access="permitAll"/> 
    ... 
    <intercept-url pattern="/**" access="hasAnyAuthority('ROLE_ADMIN','ROLE_OPERATOR')"/> 

    <form-login login-page="/login" default-target-url="/" always-use-default-target="true" 
       authentication-success-handler-ref="operatorAuthenticationSuccessHandler" authentication-failure-url="/login?error"/> 
    <logout logout-success-url="/login"/> 
</http> 

回答

1

的入口點是:

在認證過程是由試圖通過未經身份驗證的用戶觸發訪問到受保護的資源

就這麼說,入口點bean完全符合您的要求。

在您的入口點,您可以定義一個重定向到您的錯誤頁面。

@Component 
public class RestAuthenticationEntryPoint implements AuthenticationEntryPoint{ 

    @Override 
    public void commence(HttpServletRequest request, HttpServletResponse response, 
    AuthenticationException authException) throws IOException{ 
     //your implementation 
    } 
} 

上面的例子表明,你需要弄清楚如何做HttpServletReponse重定向,這裏說明了如何做一個鏈接:

HttpServletResponse sendRedirect permanent

相關問題