我对弹簧安全性有疑问。
现在我使用siple siteMinderFilter
来限制对多个页面的访问:
RequestHeaderAuthenticationFilter siteMinderFilter = new RequestHeaderAuthenticationFilter (ignored);
siteMinderFilter.setPrincipalRequestHeader("SM_USER");
siteMinderFilter.setAuthenticationManager(authenticationManager());
如果SM_USER错误,我希望使用我的SmUserFailureHandler:
@Component
public class SmUserFailureHandler extends SimpleUrlAuthenticationFailureHandler {
private Logger log = Logger.getLogger(SmUserFailureHandler.class);
@Override
public void onAuthenticationFailure(HttpServletRequest request, HttpServletResponse response, AuthenticationException exception)
throws IOException, ServletException {
super.onAuthenticationFailure(request, response, exception);
log.debug("got AuthenticationException");
if(exception.getClass().isAssignableFrom(PreAuthenticatedCredentialsNotFoundException.class)) {
log.debug("got PreAuthenticatedCredentialsNotFoundException");
}
}
}
然后在春天的配置课
@Bean
public SmUserFailureHandler smUserFailureHandler(){
return new SmUserFailureHandler();
}
但现在我无法理解如何在authenticationProvider中包含它。我找到的使用这种FailureHandler的单一位置是登录表单
http.formLogin().loginPage("/my/login/page/").failureHandler(smUserFailureHandler());
但我想将它应用于所有需要SM_USER的资源。
我该如何实施?
答案 0 :(得分:0)
您正在使用身份验证 FailureHandler ...身份验证是否成功 - 您不关心资源。如果身份验证成功 - 您已登录用户 - 则存在授权,该进程检查用户是否拥有所请求资源的权限。您需要生成/处理AccessDenied情况。
更简单的方法是在处理AccessDeniedException时覆盖逻辑(但这是为每次访问被拒绝而生成的)
<bean id="exceptionTranslationFilter"
class="org.springframework.security.ui.ExceptionTranslationFilter">
<property name="authenticationEntryPoint" ref="authenticationEntryPoint" />
<property name="accessDeniedHandler" ref="accessDeniedHandler" />
</bean>
<bean id="accessDeniedHandler" class="org.springframework.security.ui.AccessDeniedHandlerImpl">
<property name="errorPage" value="/noaccess.jsp" />
</bean>
如果要为给定资源生成特殊消息,则必须更改其他内容。也许它只需要一个AccessDecisionVoter,但我没有使用它。