Spring安全登录失败

Spring安全登录失败,spring,security,jsf,login,Spring,Security,Jsf,Login,我将SpringSecurity3.0.6与JSFMojarra2.1.18和PrimeFaces3.5一起使用 我创建了一个LoginManagedBean,它注入了SpringSecurity的AuthenticationManager @ManagedBean @SessionScoped public class LoginManagedBean implements Serializable { private static final long s

我将SpringSecurity3.0.6与JSFMojarra2.1.18和PrimeFaces3.5一起使用

我创建了一个LoginManagedBean,它注入了SpringSecurity的AuthenticationManager

 @ManagedBean
    @SessionScoped
    public class LoginManagedBean implements Serializable {

        private static final long serialVersionUID = 1L;

        private static transient final Log logger = LogFactory.getLog(LoginManagedBean.class);

        private LoginDTO login;

        private String username;

        private String password;

        @ManagedProperty(value = "#{authenticationManager}")
        private transient AuthenticationManager authenticationManager = null;

...

它起作用了。但如果登录失败,我将无法使用正确的值再次登录。我想我需要清除/重置authenticationManager对象,但我不知道如何清除/重置。有什么建议吗?提前谢谢

你应该换一种方式

1) 定义身份验证管理器

<s:authentication-manager>
    <s:authentication-provider>
        <s:user-service>
            <s:user name="root" password="root"/>
        </s:user-service>
    </s:authentication-provider>
</s:authentication-manager>

这是SpringSecurity3.0.6中的一个bug。由于某种原因,在BadCredentialsException之后密码被删除(请参阅AuthenticationException.java:58)。登录失败后,提供的密码始终为空,这是失败的。我切换到3.0.8,这就解决了问题。我还尝试切换到3.1.3,但这似乎是一项主要任务。但为什么您直接使用authenticationManager而不是内置解决方案?我想用JSF的方式来实现这一点,我觉得插入authenticationManager而不是将一些字段发布到URL更容易。顺便说一句,我没有测试它,但是3.0.6的问题仍然是一样的。Regardi尝试了你建议的方式,就像我想象的那样,我的行为与注入式authenticationManager相同。至少我的项目是这样的。使用会话范围的托管bean而不是内置解决方案的另一点是:我的应用程序中的所有托管bean都从登录托管bean获取用户信息(例如用户名、角色)…如果您使用的是我的代码,则可以从SecurityContextHolder.getContext().getAuthentication()获取用户信息
<s:http auto-config="true" use-expressions="true">
    <s:intercept-url pattern="/favicon.ico" access="permitAll"/>
    <s:intercept-url pattern="/resources/**" access="permitAll"/>
    <s:intercept-url pattern="/login**" access="isAnonymous"/>
    <s:intercept-url pattern="/pages/*" access="hasAuthority('ROLE_USER')"/>      
    <s:form-login login-page="/login.xhtml" default-target-url="/"
                  authentication-failure-url="/login.xhtml?loginFailed=true"/>
</s:http>
<filter>
    <filter-name>springSecurityFilterChain</filter-name>
    <filter-class>org.springframework.web.filter.DelegatingFilterProxy</filter-class>
</filter>
<filter-mapping>
    <filter-name>springSecurityFilterChain</filter-name>
    <url-pattern>/*</url-pattern>
    <dispatcher>FORWARD</dispatcher>
    <dispatcher>REQUEST</dispatcher>
</filter-mapping>