我正在使用的Web应用程序使用Spring Security。我对其进行了配置,以便未经授权的请求由其中一个控制器处理(使用access-denied-handler
)。但是,当有人在登录前尝试访问页面时,他发现自己处于登录页面而不通过控制器。我希望这个案例由上面提到的同一个控制器处理。
有一个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>
答案 0 :(得分:2)
切入点是:
由未经身份验证的用户尝试访问受保护资源触发身份验证过程
话虽如此,入口点bean完全符合您的要求。
在您的切入点,您可以定义重定向到错误页面。
@Component
public class RestAuthenticationEntryPoint implements AuthenticationEntryPoint{
@Override
public void commence( HttpServletRequest request, HttpServletResponse response,
AuthenticationException authException ) throws IOException{
//your implementation
}
}
上面的示例显示,您需要弄清楚如何使用HttpServletReponse
进行重定向,这是一个显示如何执行此操作的链接: