Java Spring安全性的编程使用
我正在使用Wicket Auth项目作为表示层,因此我将它与Spring安全性集成。这是Wicket为验证我而调用的方法:Java Spring安全性的编程使用,java,spring,spring-security,wicket,Java,Spring,Spring Security,Wicket,我正在使用Wicket Auth项目作为表示层,因此我将它与Spring安全性集成。这是Wicket为验证我而调用的方法: @Override public boolean authenticate(String username, String password) { try { Authentication request = new UsernamePasswordAuthenticationToken( username, pass
@Override
public boolean authenticate(String username, String password) {
try {
Authentication request = new UsernamePasswordAuthenticationToken(
username, password);
Authentication result = authenticationManager.authenticate(request);
SecurityContextHolder.getContext().setAuthentication(result);
} catch (AuthenticationException e) {
return false;
}
return true;
}
我的Spring安全XML配置的内容(内部)包括:
<http path-type="regex">
<form-login login-page="/signin"/>
<logout logout-url="/logout" />
</http>
<global-method-security secured-annotations="enabled" />
<authentication-manager alias="authenticationManager"/>
<authentication-provider user-service-ref="userService">
<password-encoder ref="bcryptpasswordencoder" />
</authentication-provider>
参考文件的第二部分说明:
在可能的情况下,会话固定攻击是一种潜在风险
让恶意攻击者创建
通过访问站点进行会话,然后
说服其他用户使用登录
同一个会话(通过向他们发送
包含会话标识符的链接
例如,作为参数)。春天
安全可以防止这种情况
通过创建新的
用户登录时的会话。如果你
不需要这种保护,否则
与其他一些要求相冲突,
您可以使用
会话固定保护
属性,其中有三个
选项:
- migrateSession—创建新会话并复制现有会话
新会话的会话属性。这是默认设置
- 没有-什么都不要做。原会期将予保留
- newSession-创建一个新的“干净”会话,而不复制
现有会话数据
身份验证是有效的,但由于我对Spring Security相当陌生,我也有一些问题需要回答:
- 通常登录时,我会将身份验证信息发布到
j_spring_security_check
,让spring security执行实际的身份验证代码。我希望有针对会话固定攻击的保护,当我像我一样执行编程登录时,我会得到它吗?如果没有,我要怎么做才能得到它
- 如何执行程序性注销
- 由于我将使用编程登录和注销,如何禁止Spring拦截这些URL
更新:
对于会话固定攻击保护,我似乎需要调用SessionUtils类中的方法,其签名为startNewSessionIfRequired(HttpServletRequest请求、boolean migrateAttributes、SessionRegistry SessionRegistry)
如何获取需要传入的SessionRegistry实例?我找不到任何方法为它创建别名ID,也找不到如何获取它的ID或名称。也许这不是您问题的完整答案,但可能对您有所帮助
当您不使用编程登录时调用的代码,但在此处可以找到标准登录:
org.springframework.security.ui.webapp.AuthenticationProcessingFilter
我猜你的代码就是受此启发的。看起来很相似
类似地,在标准方法中访问/j_spring\u security\u logout
时执行的代码如下:
org.springframework.security.ui.logout.LogoutFilter
LogoutFilter调用多个处理程序。我们正在使用的处理程序称为:
org.springframework.security.ui.logout.SecurityContextLogoutHandler
,因此您可以在方法中调用相同的代码。您确实会受到会话修复攻击。要纠正这一点,您可以再次受到Spring代码的“启发”。要创建一个新会话,您显然需要访问httpsession,因此您可能需要进行一些重构
如果您看到该方法。startNewSessionIfRequired
这将身份验证迁移到新会话。您可以直接调用这个方法,或者只是稍微重构一下代码
至于程序性注销,当您需要注销此人时,只需调用session.invalidate()
,您就不会犯太大的错误。这将从总体安全角度完成所有必要的工作,但请记住,您可能需要清理会话中的某些内容。如果您有一组非常复杂的筛选器等,并且您需要确保用户已注销请求的其余部分,那么您可以添加:
SecurityContextHolder.getContext().setAuthentication(null);
至于截取url,你可以将它们设置为未使用的内容,然后忽略它!我不确定是否可以在配置中关闭拦截-如果确实要删除它,请查看AuthenticationProcessingFilter
-您可以自定义此设置。如果这样做,则必须手动设置SpringSecurityXML,而不使用提供的名称空间。不过,这并不难——看看一些较旧的文档,您将看到如何做到这一点
希望这有帮助 1)程序性注销
调用HttpServletRequest.getSession(false)。使无效
调用SecurityContextHolder.clearContext()
2) 告诉Spring Security不要截取某些url,这取决于应用程序url空间的设置方式。如果您的所有页面(除了/logIn和/logout)都位于context/myApp,那么您可以执行以下操作:
<http ....>
<intercept-url pattern="/myApp/**" ..>
....
</http>
....
要执行程序性注销,还可以抛出org.springframework.security.core.AuthenticationException
。例如,SessionAuthenticationException
。在这种情况下,例外TranslationFilter
启动注销 我的程序登录有问题。我调用了所有的authenticationManager.authenticate(…)
和SecurityContextHolder.getContext().setAuthentication(…)
方法,但会话出现了一些问题。我必须添加以下行以正确管理会话:
HttpSession session = request.getSession();
session.setAttribute("SPRING_SECURITY_CONTEXT", SecurityContextHolder.getContext());
从上面发布的示例代码中不清楚这一点。有关详细信息,请参见
try {
HttpSession session = request.getSession(false);
if (session != null) {
session.invalidate();
}
SecurityContextHolder.clearContext();
} catch (Exception e) {
logger.log(LogLevel.INFO, "Problem logging out.");
}
多好的回答啊!:-)Spring3.0参考文档(我的try块中的三行是直接复制粘贴)给了我更多的灵感。我会调查你提到的代码!非常感谢。我现在还没有回答这个问题,因为我现在还没有回答