Spring Security拦截器没有按需限制访问

时间:2018-07-19 17:02:11

标签: spring spring-security servlet-filters

如果用户未通过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/home URL,那么一切都很好。 Spring Security将我重定向到登录页面。

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

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

流:正确显示403,但是如果过滤条件为true,那么为什么Spring不截取URL(未获得登录页面)。

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

0 个答案:

没有答案