在春季 j_acegi_security_check 中停止接受 GET 请求
Posted
技术标签:
【中文标题】在春季 j_acegi_security_check 中停止接受 GET 请求【英文标题】:Stop accepting GET request in spring j_acegi_security_check 【发布时间】:2012-08-31 23:41:35 【问题描述】:我正在使用j_acegi_security_check
登录到Spring
网络应用程序,但因为它也接受GET
参数,这意味着我能够登录到应用程序
<https://localhost:8080/webapp/j_acegi_security_check?j_username=***&j_password=***&loginButton=Login>
我想避免这种情况。它应该只接受POST
请求。如何做到这一点?
【问题讨论】:
【参考方案1】:默认情况下,spring security 3.x 只接受POST
的登录请求。
但您可以使用org.springframework.security.web.authentication.UsernamePasswordAuthenticationFilter
的postOnly
参数控制此行为
(但正如我之前所说,postOnly
的默认值为 true)
但也许主要问题是您使用的是旧的 spring acegi security 而不是实际的 spring security 3.x。情况是这样,而不是上面的陈述是我不正确的。所以我强烈建议更新!
如果是 Spring ACEGI 1.0.x
尝试使用以下内容覆盖AuthenticationProcessingFilter
中的attemptAuthentication
方法:
if (request.getMethod().equals("POST"))
return super.attemptAuthentication(request);
else
throw new AuthenticationServiceException("service accept only http post");
查看 cmets:覆盖 onPreAuthentication()
seams 也是一个好方法
【讨论】:
感谢您回复 Ralph...在我目前的应用程序中,我使用的是 1.0.5 版本,您知道如何在该版本安全性中将其设为“PostOnly”吗?我没有权限更新罐子.. 查看代码,并搜索负责身份验证的过滤器(UsernamePasswordAuthenticationFilter -- 在 1.0.5 中它至少有一个其他包,可能是其他名称)。如果它没有这个参数,你需要子类过滤器并添加类似if (!request.getMethod().equals("POST")) throw new AuthenticationServiceException("not a POST");
我正在使用这个 org.acegisecurity.ui.webapp.AuthenticationProcessingFilter 过滤器,我在 acegi_security 包中找到了一个 UsernamePasswordAuthenticationToken 类 与您上面提供的类的名称相似,那么我应该扩展哪个类??
我不想变得不礼貌,但是您是否看过这些课程,您是否阅读过它的 java 文档,您是否尝试了解它们的作用? -- 我希望如此,否则我会非常难过我告诉你这是AuthenticationProcessingFilter
覆盖attemptAuthentication
这样的方法if (request.getMethod().equals("POST")) return super.attemptAuthentication(request); else throw new AuthenticationServiceException("service accept only http post");
我扩展了 AuthenticationProcessingFilter 覆盖的 onPreAuthentication() 方法,现在它工作正常。感谢您的支持拉尔夫..:)以上是关于在春季 j_acegi_security_check 中停止接受 GET 请求的主要内容,如果未能解决你的问题,请参考以下文章
春季测试中的@QuerydslPredicate 在standaloneSetup 中失败