春季安全。自定义身份验证管理器

Posted

技术标签:

【中文标题】春季安全。自定义身份验证管理器【英文标题】:Spring security. Custom AuthenticationManager 【发布时间】:2013-02-24 15:07:50 【问题描述】:

我有 spring mvc 应用程序。我已经用 CustomAuthenticationManager 添加了 Spring Security。这是包含在 appContex.xml 中的 application-security.xml。在 login.jsp 中,我使用带有 2 个输入的标准登录页面:name='j_username' & name='j_password' 而在 CustomAuthenticationManager.authenticate(Authentication authentication) 中的方法中,我只收到密码,但没有收到密码的主体名称。我做错了什么?

<?xml version="1.0" encoding="UTF-8"?>

<beans xmlns="http://www.springframework.org/schema/beans"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:util="http://www.springframework.org/schema/util"
    xmlns:p="http://www.springframework.org/schema/p" xmlns:security="http://www.springframework.org/schema/security"
    xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.1.xsd
                        http://www.springframework.org/schema/util http://www.springframework.org/schema/util/spring-util-3.1.xsd
                        http://www.springframework.org/schema/security http://www.springframework.org/schema/security/spring-security-3.0.xsd">


<bean id="loginPassAuthenticationFilter"
    class="org.springframework.security.web.authentication.UsernamePasswordAuthenticationFilter">
    <property name="authenticationManager" ref="customAuthenticationManager" />
    <property name="allowSessionCreation" value="true" />
    <property name="filterProcessesUrl" value="/j_spring_security_check" />
    <property name="authenticationFailureHandler" ref="customAuthenticationFailureHandler" />
    <property name="authenticationSuccessHandler" ref="customAuthenticationSuccessHandler" />
</bean>

<bean id="customAuthenticationManager"
    class="com.whatever.security.CustomAuthenticationManager" />
<bean id="authenticationFilter"
    class="org.springframework.security.web.authentication.UsernamePasswordAuthenticationFilter"
    p:authenticationManager-ref="customAuthenticationManager"
    p:authenticationFailureHandler-ref="customAuthenticationFailureHandler"
    p:authenticationSuccessHandler-ref="customAuthenticationSuccessHandler" />

<bean id="customAuthenticationFailureHandler"
    class="org.springframework.security.web.authentication.SimpleUrlAuthenticationFailureHandler"
    p:defaultFailureUrl="/?error=true" />

<bean id="customAuthenticationSuccessHandler"
    class="org.springframework.security.web.authentication.SimpleUrlAuthenticationSuccessHandler"
    p:defaultTargetUrl="/" />

<bean id="authenticationEntryPoint"
    class="org.springframework.security.web.authentication.LoginUrlAuthenticationEntryPoint"
    p:loginFormUrl="/" />
<security:authentication-manager />
<bean id="passwordEncoder"
    class="org.springframework.security.authentication.encoding.ShaPasswordEncoder">
    <constructor-arg value="512" />
</bean>

<form name='f' action="<c:url value='j_spring_security_check' />"
    method='POST'>
    <table>
        <tr>
            <td>User:</td>
            <td><input type='text' name='j_username' value=''></td>
        </tr>
        <tr>
            <td>Password:</td>
            <td><input type='password' name='j_password' /></td>
        </tr>
        <tr>
            <td colspan='2'><input name="submit" type="submit"
                value="submit" /></td>
        </tr>
        <tr>
            <td colspan='2'><input name="reset" type="reset" /></td>
        </tr>
    </table>
</form>

【问题讨论】:

您的j_username 输入指定了它自己的value=''。这可能会抢占用户输入值。 不,这没有帮助 嗯,我将记录器放入身份验证管理器中,当我使用 eclipse 部署应用程序时,它在调试中显示我找到了任何登录名,但如果它是在真实服务器上使用控制台部署的 - 记录器显示登录名... 【参考方案1】:

我建议使用安全命名空间(链接到最小配置的示例):http://static.springsource.org/spring-security/site/docs/3.1.x/reference/springsecurity-single.html#ns-minimal

这里是您如何定义自己的身份验证提供程序的链接: http://static.springsource.org/spring-security/site/docs/3.1.x/reference/springsecurity-single.html#ns-auth-manager

创建您自己的身份验证提供程序可以解决大多数用例。 如果您需要任何其他说明,请告诉我。

最好的问候,

迈克尔

【讨论】:

以上是关于春季安全。自定义身份验证管理器的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 Windows 身份验证并注册自定义身份验证管理器

如何在 Wildfly 中提供自定义身份验证/授权管理器

Spring OAuth2 自定义身份验证管理器 ClassCastException

配置 WSO2 API 管理器自定义身份验证器和声明

Spring 社交登录和 Spring Security 自定义身份验证管理器

具有 Spring Security 和 Java 配置的自定义身份验证管理器