1

在过去的几天里,我一直在疯狂地尝试使用 Spring Security 创建一个自定义登录页面,但是我没有找到一个可行的示例,也没有自己弄清楚如何使用 Spring 验证表单,相信我,我尝试了一切,我可能在谷歌上找到每个相关的例子。

表单加载正常,一切就绪,当我单击“登录”按钮时,我只需要让 Spring Security 对数据库的凭据进行身份验证。

让我把它分成几部分来解释。

所以,我有一个登录表单:

<h:form>
 <p:panelGrid columns="2">

    <p:outputLabel for="j_username" value="Usuário:"/>
    <p:inputText id="j_username"
                 title="Preencha com o seu usuário (login)."
                 required="true"
                 requiredMessage="O campo usuário é obrigatório."
                 value="#{loginBean.usuario}"/>

     <p:outputLabel for="j_password" value="Senha:"/>
     <p:password id="j_password"
                 title="Preencha com a sua senha."
                 required="true"
                 requiredMessage="O campo senha é obrigatório."
                 value="#{loginBean.senha}"/>

      <p:inputText type="hidden"/>

      <p:panelGrid columns="2" styleClass="customPanelgridTable">
       <p:outputLabel for="_spring_security_remember_me" value="Lembrar senha? "/>
         <p:selectBooleanCheckbox id="_spring_security_remember_me"
                                  value="#{loginBean.lembrar_me}"/>
      </p:panelGrid>

      <f:facet name="footer">
        <p:commandButton value="Entrar"
                         actionListener="#{loginBean.doLogin}"/>
      </f:facet>
 </p:panelGrid>
</h:form>

我需要方法“doLogin”来使用 Spring Security 验证凭据。

我的登录豆:

@Named
@SessionScoped
public class LoginBean implements Serializable {

private static final long serialVersionUID = 1L;

private String usuario, senha;
private boolean lembrar_me = false;

public String getUsuario() {
    return usuario;
}

public void setUsuario(String usuario) {
    this.usuario = usuario;
}

public String getSenha() {
    return senha;
}

public void setSenha(String senha) {
    this.senha = senha;
}

public boolean isLembrar_me() {
    return lembrar_me;
}

public void setLembrar_me(boolean lembrar_me) {
    this.lembrar_me = lembrar_me;
}

public void doLogin() {
  //Spring validation...
}

}

我怎样才能做到这一点?

应用程序上下文.xml

<http security="none" pattern="/javax.faces.resource/**" />
<http security="none" pattern="/static/**"/>
<http auto-config="true" use-expressions="true"
                  access-denied-page="/public/login.xhtml">

    <intercept-url pattern="/public/**" access="permitAll"/>
    <intercept-url pattern="/secure/**" access="hasRole('ROLE_USER')"/>
    <intercept-url pattern="/login.xhtml" access="permitAll"/>
    <intercept-url pattern="/**" access="hasRole('ROLE_USER')"/>
    <form-login login-page="/public/login.xhtml"
                authentication-failure-url="/public/login.xhtml?erro=true"
                default-target-url="/secure/secure.xhtml"/>

</http>

<beans:bean id="dataSource" 
            class="org.springframework.jdbc.datasource.DriverManagerDataSource" >

    <beans:property name="url" value="jdbc:mysql://localhost:3306/gde" />
    <beans:property name="driverClassName" value="com.mysql.jdbc.Driver" />
    <beans:property name="username" value="root" />
    <beans:property name="password" value="" />
</beans:bean>

<authentication-manager>
    <authentication-provider>

        <user-service>
            <user name="teste" password="teste" authorities="ROLE_USER"/> 
        </user-service>

        <jdbc-user-service data-source-ref="dataSource"
                           users-by-username-query="SELECT USUARIO as username, ISATIVO as enabled FROM usuario WHERE USUARIO=?"

                           authorities-by-username-query="SELECT USUARIO as username, AUTORIZACOES as authority FROM usuario_tipo_usuario WHERE USUARIO=?"
        />
    </authentication-provider>
</authentication-manager>

非常感谢任何帮助,我坚持了好几天!!!

4

2 回答 2

0

由于您想要primefaces的漂亮ajax功能,您不能使用spring security提供的UsernamePasswordAuthenticationFilter。尝试直接调用AuthenticationManager,然后(身份验证管理器和命名空间解释了如何获取对它的引用)。

于 2012-11-19T20:59:00.610 回答
0

您不需要 bean 来验证 spring 安全登录。

要自定义表单登录,form-login 元素是正确的位置,您确实可以将 JSF 页面指定为login-page. 但是,该登录页面必须提供 spring 安全登录页面的预期行为。要了解这种行为,请阅读form-login 元素的参考文档,其中列出了以下可选参数:

登录处理 url

映射到 UsernamePasswordAuthenticationFilter 的 filterProcessesUrl 属性。默认值为“/j_spring_security_check”。

密码参数

包含密码的请求参数的名称。默认为“j_password”。

用户名参数

包含用户名的请求参数的名称。默认为“j_username”。

也就是说,spring security 期望凭证作为 http post 的请求参数传递到特定的 url。您的 JSF 表单违反了该约定:它被发布到错误的 URL(因为您使用 ah:form,它希望 JSF 处理表单提交请求)。尝试改用 html <form>

至于如何从数据库加载用户详细信息,参考文档在Using other Authentication Providers中对此进行了介绍。

于 2012-11-19T20:20:41.117 回答