如何使用自定义 JAAS 堆栈配置 Spring Security?

Posted

技术标签:

【中文标题】如何使用自定义 JAAS 堆栈配置 Spring Security?【英文标题】:How to configure spring security with custom JAAS stack? 【发布时间】:2012-03-30 23:48:39 【问题描述】:

我已关注this tutorial,以便为我的 spring mvcbasedweb 应用程序添加基本的 spring 安全性。

在添加 spring 安全层之前,我的应用程序使用在我的 web.xml 中配置的自定义 SSO 登录模块进行了保护:

 <login-config>
        <auth-method>MyLoginModule</auth-method>
    </login-config>

此登录模块负责重定向到登录表单、执行登录等,并且按预期工作。 添加基本​​的 spring 安全层后,应用程序将重定向到我的自定义登录页面,当我进行身份验证时,使用 spring 的标准“使用用户名和密码登录”表单通过另一个身份验证。

我的问题是如何将 spring 配置为仅使用我上面的 login-config 来执行身份验证并删除它自己多余的“内置”表单?

【问题讨论】:

您是否阅读了参考手册中有关 JAAS 的信息,查看了 JAAS 示例等?此外,在您的问题标题中提及 JAAS 可能也很有意义,因为“登录模块”一词本身就很模糊,很多人不会意识到您指的是特定技术。 感谢您对问题标记的评论。不确定我是否理解你的问题。我的 JAAS 堆栈自己运行良好,我的 spring 安全设置自己运行良好,我似乎无法让 spring security 触发 MyLoginModule 来执行身份验证。 【参考方案1】:

我在 Spring Security 参考中找到了我正在寻找的内容。具体来说,关于Java Authentication and Authorization Service (JAAS) Provider的章节。

【讨论】:

此 url 将始终指向 Spring Security 的当前版本:docs.spring.io/spring-security/site/docs/current/reference/html/…【参考方案2】:

抱歉,我之前没有理解您的情况。检查this 以执行您的身份验证。您应该将用户注册到 SecurityContextHolder。

也请访问oficial spring 3.1 security reference。

下面的例子是典型的表单web认证(一定要用spring j_username/password来识别):

<form id="loginForm" name="loginForm"
action="<c:url value='my_security_check'/>" method="POST">
    ... 
<label for="user">The username</label><input type="text" name="j_username"/>
<label for="password">The password</label><input type='password'
      name='j_password'/>
    ...
<input name="submitButton" type="submit" value="submit"/>
    ...

你必须在你的 spring 安全文件中定义这个安全检查:

    <security:form-login login-page="/login"
        default-target-url="/welcome" 
        login-processing-url="/my_security_check" />
    <security:logout logout-url="/my_security_logout"
        logout-success-url="/login" />
 </security:http>

在我使用 Tiles 的情况下,我还必须将其添加到我的 mvc 配置文件中:

<mvc:view-controller path="/login" view-name="login" />

示例和源代码:mkyong.com/spring-security/spring-security-form-login-example/

【讨论】:

但这是为了告诉它我的登录页面在哪里,我希望它使用我的 LoginModule 进而将用户重定向到登录页面 只需在 Spring Security 中将您的 default-target-url 定义为您想要的页面。我编辑答案更简洁。 再次,我没有可以设置的登录页面,在我的 jass 堆栈中配置了一个登录模块来处理它,我希望 spring security 调用/使用它来执行登录 如果不使用spring登录,尝试获取autenticated用户,或者用spring设置。 SecurityContextHolder.getContext().getAuthentication();

以上是关于如何使用自定义 JAAS 堆栈配置 Spring Security?的主要内容,如果未能解决你的问题,请参考以下文章

具有数据库授权的 Spring JAAS 身份验证

JAAS 注销不适用于自定义登录模块

绕过对用户名/密码的 JConsole 要求 - 当使用带有 JMX 的 Jaas 自定义登录模块来处理授权和身份验证时

在 Spring Boot 应用程序中防止自定义异常的堆栈跟踪日志记录

如何使用 jetty-maven-plugin 10 指定 JAAS 配置文件

Logback - 如何编写自定义异常转换器以将堆栈跟踪折叠成一行