spring - 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/home
URL,那么一切都很好。Spring Security 将我重定向到登录页面。
流程:首先我的自定义过滤器将被激活,并且由于它没有“安全”,它将通过然后 Spring 将拦截 URL 并将其重定向到登录页面。
现在,如果我http://localhost:8080/sweb/all/secure/getname
通过自定义过滤器点击包含“安全”的 URL,将拦截它并以 403/success 响应,但它不会显示登录页面。
Flow: 403 正确显示,但如果过滤条件为真,那么为什么 Spring 没有拦截 URL(没有获取登录页面)。
我想要的是,首先 Spring 应该拦截 URL 以检查用户是否登录,然后检查我的过滤器。
解决方案
推荐阅读
- swift - 如何通过通用属性比较结构
- asp.net-identity - SecurityStamp 不会在密码更改时更新
- javascript - Twilio Chat:尝试在频道上获取会员可达性的通知
- html - nth-of-type,除了标题
- javascript - 如何在反应应用程序中从 clientJS 获取浏览器指纹?
- python - 熊猫数据框检查列是否包含另一列中存在的字符串
- sql - 使用 txid 获取最新的未处理、更新的行
- python - 如何动态计算熊猫系列的平均值?
- javascript - 我想不通的编码挑战
- android - How can I start a new activity within a separate process without losing onActivityResult callback?