1

過去数日間、私は春のセキュリティを使用してカスタムログインページを作成しようと夢中になっていたが、実際の例を見つけることも、春を使用してフォームを検証する方法を自分で理解することもできなかった。 、私がおそらくグーグルで見つけることができた関連するすべての例。

フォームは正常に読み込まれ、すべてが整っています。必要なのは、[ログイン]ボタンをクリックしたときにSpringSecurityにデータベースに対して資格情報を認証させることだけです。

分割して説明させていただきます。

だから、私はログインフォームを持っています:

<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>

また、Spring Securityを使用して資格情報を検証するには、メソッド「doLogin」が必要です。

私のLoginBean:

@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...
}

}

どうやってやるの?

applicationContext.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

Springセキュリティログインを検証するためにBeanは必要ありません。

フォームログインをカスタマイズするには、form-login要素が適切な場所であり、実際にJSFページをとして指定できますlogin-page。ただし、そのログインページは、SpringSecurityログインページに期待される動作を提供する必要があります。その動作を理解するには、次のオプションのパラメータをリストしているform-login要素のリファレンスドキュメントをお読みください。

login-processing-url

UsernamePasswordAuthenticationFilterのfilterProcessesUrlプロパティにマップします。デフォルト値は「/j_spring_security_check」です。

パスワードパラメータ

パスワードを含むリクエストパラメータの名前。デフォルトは「j_password」です。

ユーザー名-パラメーター

ユーザー名を含むリクエストパラメータの名前。デフォルトは「j_username」です。

つまり、Spring Securityは、クレデンシャルがhttppostのリクエストパラメータとして特定のURLに渡されることを想定しています。あなたのJSFフォームはその契約を破ります:それは間違ったURLに投稿されます(JSFがフォーム送信リクエストを処理することを期待するah:formを使用するため)。<form>代わりにhtmlを使用してみてください。

データベースからユーザーの詳細をロードする方法については、リファレンスドキュメントで、他の認証プロバイダーの使用でこれについて説明しています。

于 2012-11-19T20:20:41.117 に答える
0

Primefacesの気の利いたajax機能が必要なため、SpringSecurityが提供するUsernamePasswordAuthenticationFilterを使用することはできません。次に、 AuthenticationManagerを直接呼び出してみてください( Authentication Managerと名前空間では、AuthenticationManagerへの参照を取得する方法について説明しています)。

于 2012-11-19T20:59:00.610 に答える