如果用户未通过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以检查是否 用户是否登录,然后检查我的过滤器。