首页 > 解决方案 > Spring Security 拦截器未根据需要限制访问

问题描述

如果用户未登录,我试图通过 Spring Security 限制对某些 URL 的访问。

XML配置:

<security:http>
    <security:intercept-url pattern="/all/**" access="hasRole('USER')" />
    <security:form-login login-page="/login" authentication-failure-url="/login?error" authentication-success-forward-url="/all/home"/>
    <security:logout  logout-url="/logout" /> 
    <security:custom-filter ref="jwtfilter" after="LOGIN_PAGE_FILTER"/> 
    <security:csrf/>
</security:http>

我有一个过滤器,它检查 URL 中是否存在“安全”,如果存在,那么如果一切正确,我将执行一些检查并将其转发给控制器,否则使用“403”拒绝。

筛选:

String aheader=httprequest.getHeader("Authorization");
if (!aheader.isEmpty()) {
    if (this.generator.validateToken(aheader)) {
        Authentication authentication = this.generator.getauthenticated(aheader);
        SecurityContextHolder.getContext().setAuthentication(authentication);
        logger.info("security context");
        //proper
        chain.doFilter(httprequest, httpresponse);  
    } else {
        logger.info("token validation error");
        httpresponse.setStatus(HttpServletResponse.SC_FORBIDDEN);
    }   
} else {
    logger.info("header empty");
    httpresponse.setStatus(HttpServletResponse.SC_FORBIDDEN);
}

问题:

如果我点击http://localhost:8080/sweb/all/homeURL,那么一切都很好。Spring Security 将我重定向到登录页面。

流程:首先我的自定义过滤器将被激活,并且由于它没有“安全”,它将通过然后 Spring 将拦截 URL 并将其重定向到登录页面。

现在,如果我http://localhost:8080/sweb/all/secure/getname通过自定义过滤器点击包含“安全”的 URL,将拦截它并以 403/success 响应,但它不会显示登录页面。

Flow: 403 正确显示,但如果过滤条件为真,那么为什么 Spring 没有拦截 URL(没有获取登录页面)。

我想要的是,首先 Spring 应该拦截 URL 以检查用户是否登录,然后检查我的过滤器。

标签: springspring-securityservlet-filters

解决方案


推荐阅读