当前位置: 首页 > 面试题库 >

以编程方式使用Spring Security

戚正业
2023-03-14
问题内容

我将Wicket与Wicket Auth Project一起用于表示层,因此将其与Spring
Security集成在一起。这是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 Security 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>

2.3.6节。参考文档的会话固定攻击防护说:

会话固定攻击是一种潜在的风险,恶意攻击者有可能通过访问站点来创建会话,然后诱使另一个用户以相同的会话登录(通过向他们发送包含会话标识符作为参数的链接,以便例)。Spring
Security通过在用户登录时创建一个新会话来自动防御这种情况。如果您不需要此保护,或者与其他要求冲突,则可以使用上的session-
fixation-protection属性来控制行为。有三个选项:

  • migrateSession-创建一个新会话,并将现有会话属性复制到新会话。这是默认值。
  • 无-不做任何事情。原始会话将保留。
  • newSession-创建一个新的“干净”会话,而不复制现有会话数据。

身份验证是可行的,但是作为Spring Security的新手,我也有一些问题,我也需要答案:

  • 通常,对于登录,我会将身份验证信息发布到,j_spring_security_check然后让Spring Security执行实际的身份验证代码。我想防御会话固定攻击,像我一样执行程序化登录时可以得到保护吗?如果没有,我该怎么做才能得到它?
  • 如何执行程序化注销?
  • 当我将使用程序化登录和注销时,如何禁用Spring截获这些URL?

更新:
为了保护会话固定攻击,似乎我需要使用签名调用SessionUtils类中的方法startNewSessionIfRequired(HttpServletRequest request, boolean migrateAttributes, SessionRegistry sessionRegistry)

如何获取需要传递的SessionRegistry实例?我找不到任何为其创建别名ID的方法,也找不到如何获取其ID或名称的方法。


问题答案:

也许这不是您问题的完整答案,但也许可以帮到您。

当您不使用程序化登录名时会调用该代码,但可以在此处找到标准的代码:

org.springframework.security.ui.webapp.AuthenticationProcessingFilter

我想您的代码启发了您。看起来很相似。

同样/j_spring_security_logout,在标准方法中访问时执行的代码也位于以下位置:

org.springframework.security.ui.logout.LogoutFilter

LogoutFilter调用多个处理程序。我们使用的处理程序称为:
org.springframework.security.ui.logout.SecurityContextLogoutHandler,因此您可以在方法中调用相同的代码。



 类似资料:
  • 使用 lavas init 创建的模板项目中,在以下场景下都会以编程方式使用 Lavas: server.dev.js 开发环境下的 SPA/SSR 模式。 server.prod.js 生产环境下的 SSR 模式。 可见以编程方式使用 Lavas 的主要场景就是 SSR 模式,而在 SPA 模式下仅仅是供开发服务器使用。因此,如果开发者选择了 SSR 模式,阅读下面的内容将十分有帮助: 如何选择

  • 问题内容: 作为单元测试的一部分,我想调用限于错误信号部分的pylint检查器。因此我检查了pylint可执行脚本,进入了helper类,在那里我迷失了一个很长的函数,最后以调用。 有人尝试过并设法这样做吗? 梦想计划是这样的: 有什么提示吗?除了“复制方法并跳过”之外,我的意思是? 我并不 需要 通过运行测试,它也可能是或其他软件:随时提出替代方案。谢谢! 问题答案: 看一下,其中包含以编程方式

  • 是否有一种编程(基于属性)的方法在Spring引导(1.2.2)中禁用RabbitAutoConfiguration。 看起来像Spring。rabbitmq。dynamic=false仅禁用AmqpAdmin,而不禁用连接工厂等。 我们想要一个模型,其中应用程序属性可以来自Spring Cloud config(包括控制总线)或通过-D jvm args。这个决定是在部署时做出的。当属性来自-D

  • 问题内容: 通过使用我可以使用元素创建由React Router本机处理的链接。 我在内部看到它的呼唤。 我想导航。不是来自链接,而是来自下拉菜单(例如)。如何在代码中执行此操作?什么啊 我看到了mixin,但是如果没有,我可以这样做吗? 问题答案: 带有钩子的React Router v5.1.0 如果您使用React> 16.8.0和功能组件,则React Router> 5.1.0中会有一个

  • 问题内容: 我试图仅通过使用和此参考来配置和设置Log4j2 。我使用的代码如下: 注意 它扩展了默认情况下已经配置的控制台 它尝试向根记录器添加滚动文件追加器 我得到以下异常: 如果我在上面的代码之后注释掉该代码,它可以工作,但似乎缺少配置滚动文件附加程序的内容。我应该怎么做才能解决这个问题? 问题答案: 在 log4j 2.x中, 您必须以这种方式指定日期格式 标记格式的开始 表示它是日期格式

  • 我有一个servlet,我希望使用Jetty以编程方式部署它。servlet使用Spring,它web.xml指向您所期望的Spring上下文XML文件。 目前,我只是使用我自己的servlet尝试Jetty文档中的示例代码: 这会导致以下异常: 我如何设置servlet,以便Jetty知道它在哪里。xml和Spring上下文是什么? 任何帮助都将不胜感激! 编辑 所以,显然我不需要web.xml