web-dev-qa-db-fra.com

Page de connexion Spring Security

J'ai développé une application qui utilise la page de connexion par défaut de Spring Security. Cependant, je veux implémenter ma propre page de connexion. Je mettrai un login.html au lieu d'une page jsp. Je veux utiliser JQuery pour cela. J'ai examiné de nombreux exemples mais je n'ai pas réussi. Je suis nouveau dans Spring et Spring Security, j'utilise Spring Security 3. Avez-vous des idées sur les étapes à suivre?

21
kamaci

Il existe quatre exigences pour une page de connexion personnalisée dans Spring Security:

  1. Il existe un champ de saisie nommé j_username qui contiendra le nom utilisé pour les informations d'authentification.
  2. Il existe un champ de saisie nommé j_password qui contiendra le mot de passe utilisé pour les informations d'authentification.
  3. L'URL à laquelle ces valeurs sont POSTed correspond à l'URL définie dans le login-processing-url attribut de form-login élément dans votre configuration Spring Security.
  4. L'emplacement du formulaire de connexion personnalisé doit être spécifié dans le login-page attribut de form-login élément dans votre configuration Spring Security.

Login.html

    <body>
      <form action="/j_spring_security_check" method="POST">
        <label for="username">User Name:</label>
        <input id="username" name="j_username" type="text"/>
        <label for="password">Password:</label>
        <input id="password" name="j_password" type="password"/>
        <input type="submit" value="Log In"/>
      </form>
    </body>

fichier de configuration de sécurité Spring

    <http use-expressions="true">
      <intercept-url pattern="/login*" access="isAnonymous()"/>
      <intercept-url pattern="/**" access="isFullyAuthenticated()"/>
      <form-login
        login-page="/login.html"
        login-processing-url="/j_spring_security_check.action"
        authentication-failure-url="/login_error.html"
        default-target-url="/home.html"
        always-use-default-target="true"/>
    </http>
45
Ryan Ransford

Je travaille depuis quelques jours sur l'implémentation de la sécurité du printemps dans mon projet et la configuration qui l'a finalement fait était la suivante:

spring-security.xml

<security:http auto-config="true" disable-url-rewriting="true" use-expressions="true">

    <security:form-login 
        login-page="/login.html"
        login-processing-url="/j_spring_security_check.action"
        default-target-url="/index.html"
        always-use-default-target="true"
        authentication-failure-url="/login.html?error=true" />
    <security:intercept-url pattern="/login*" access="isAnonymous()" />
    <security:intercept-url pattern="/**" access="hasRole('ROLE_USER')" />
</security:http>

<security:authentication-manager>
    <security:authentication-provider>
        <security:jdbc-user-service
            data-source-ref="dataSource"
            users-by-username-query="select username, password, enabled from smartcaldb.users where username=?"
            authorities-by-username-query="select u.username, r.authority from smartcaldb.users u, smartcaldb.roles r where u.userid = r.userid and u.username =?" />
    </security:authentication-provider>
</security:authentication-manager>

spring-config.xml

<mvc:annotation-driven />
<context:component-scan base-package="com.smartcal.**" />

<!-- setup database connectivity bean -->

<bean id="dataSource" class="org.Apache.commons.dbcp2.BasicDataSource"
    destroy-method="close">
    <property name="driverClassName" value="${jdbc.driverClassName}" />
    <property name="url" value="${jdbc.url}" />
    <property name="username" value="${jdbc.username}" />
    <property name="password" value="${jdbc.password}" />
</bean>

<context:property-placeholder location="/WEB-INF/jdbc.properties" />

<bean id="jdbcTemplate" class="org.springframework.jdbc.core.JdbcTemplate">
    <constructor-arg ref="dataSource"/>
</bean>

web.xml

<welcome-file-list>
    <welcome-file>index.html</welcome-file>
</welcome-file-list>

<context-param>
    <param-name>contextConfigLocation</param-name>
    <param-value>
        /WEB-INF/spring-config.xml
        /WEB-INF/spring-security.xml
    </param-value>
</context-param>

<listener>
    <listener-class>org.springframework.web.context.request.RequestContextListener</listener-class>
</listener>
<listener>
    <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>

<servlet>
    <servlet-name>dispatcher</servlet-name>
    <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
    <load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
    <servlet-name>dispatcher</servlet-name>
    <url-pattern>/login</url-pattern>
    <url-pattern>/</url-pattern>
</servlet-mapping>

<filter>
    <filter-name>springSecurityFilterChain</filter-name>
    <filter-class>org.springframework.web.filter.DelegatingFilterProxy</filter-class>
    <init-param>
        <param-name>contextAttribute</param-name>
        <param-value>org.springframework.web.context.WebApplicationContext.ROOT</param-value>
    </init-param>
</filter>
<filter-mapping>
    <filter-name>springSecurityFilterChain</filter-name>
    <url-pattern>/*</url-pattern>
</filter-mapping>

<error-page>
    <error-code>403</error-code>
    <location>/403</location>
</error-page>

login.html

<body>
    <form action="/smartcal/j_spring_security_check.action" method="POST">
        <label for="username">User Name:</label>
        <input id="username" name="j_username" type="text" />
        <label for="password">Password:</label>
        <input id="password" name="j_password" type="password" />
        <input type="submit" value="Log In" />
    </form>
</body>

pour la déconnexion, utilisez l'URL - "/ {yourAppPathInTheContainer}/j_spring_security_logout"

6
gorjanz