Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/305.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java Spring安全性的编程使用_Java_Spring_Spring Security_Wicket - Fatal编程技术网

Java Spring安全性的编程使用

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

我正在使用Wicket Auth项目作为表示层,因此我将它与Spring安全性集成。这是Wicket为验证我而调用的方法:

@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块中的三行是直接复制粘贴)给了我更多的灵感。我会调查你提到的代码!非常感谢。我现在还没有回答这个问题,因为我现在还没有回答