2012-11-14 1 views
5

Wenn ich versuche, ein benutzerdefiniertes Login-Formular mit Spring Security zu verwenden, bringt es mich auf die Seite/admin/login zurück, unabhängig davon, ob ich die richtigen Zugangsdaten eingegeben habe oder nicht. Wenn ich einen leeren <form-login /> benutze, funktioniert der Sicherheits-Check gut. Aber sobald ich eine benutzerdefinierte <form-login login-page="/admin/login" /> hinzufügen, werde ich immer wieder auf die gleiche Seite zurückkehren. Ich habe versucht, eine default-target-url="admin/forSale" /> hinzuzufügen, aber ich bin immer noch auf die Anmeldeseite zurückgekehrt. Nachdem ich die korrekten Zugangsdaten angegeben und auf die Anmeldeseite zurückgekehrt bin, versuche ich auf eine geschützte URL zuzugreifen und werde wieder zur Anmeldeseite zurückkehren. Daher bin ich mir zu 99% sicher, dass die Sicherheitsüberprüfung überhaupt nicht durchgeführt wurde.Spring Security 3.1

Die action="<c:url value='j_spring_security_check' />" in meinem JSP erstellt eine URL zu http://localhost:8080/sharleepark/admin/j_spring_security_check. Ich nehme an, der Filter sollte das trotzdem aufgreifen und die Sicherheit entsprechend verarbeiten?

Ich bin überzeugt, dass es einen einfachen Fehler in meinem Controller oder JSP gibt, den ich nicht abholen. Ich verwende Tiles2 Templates auch, könnte das ein Teil des Problems sein? Ich habe ein paar Tage damit verbracht und habe alle Spring Security Tutorials ausprobiert, die ich vergebens finden kann. Vielen Dank im Voraus für Ihre Hilfe.

feder servlet.xml

<?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:context="http://www.springframework.org/schema/context" 
xmlns:mvc="http://www.springframework.org/schema/mvc" xmlns:p="http://www.springframework.org/schema/p" 
xmlns:tx="http://www.springframework.org/schema/tx" 
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd 
    http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-3.0.xsd 
    http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc-3.0.xsd 
    http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-3.0.xsd "> 

    <!-- Scans packages to auto declare the beans we require --> 
    <context:component-scan base-package="au.com.sharleepark.controller" /> 
    <context:component-scan base-package="au.com.sharleepark.service" /> 
    <context:component-scan base-package="au.com.sharleepark.hibernate" /> 
    <context:component-scan base-package="au.com.sharleepark.helper" /> 

    <mvc:annotation-driven /> 
    <tx:annotation-driven /> 

    <!-- Map our static resources to a friendly URL --> 
    <mvc:resources location="/static/" mapping="/static/**" /> 

    <!-- Specify the view resolver that we wish to use --> 
    <bean id="viewResolver" class="org.springframework.web.servlet.view.UrlBasedViewResolver"> 
     <property name="viewClass" value="org.springframework.web.servlet.view.tiles2.TilesView" /> 
    </bean> 

    <!-- Tell the tiles configurator where our tiles configuration files are located --> 
    <bean id="tilesConfigurer" class="org.springframework.web.servlet.view.tiles2.TilesConfigurer"> 
     <property name="definitions"> 
      <list> 
        <value>/WEB-INF/tiles.xml</value> 
      </list> 
     </property> 
    </bean> 

    <!-- Our datasource --> 
    <!-- Defines our connection to the database --> 
    <bean id="dataSource" 
    class="org.springframework.jdbc.datasource.SingleConnectionDataSource" 
    destroy-method="destroy"> 
     <property name="driverClassName" value="com.mysql.jdbc.Driver" /> 
     <property name="url" value="jdbc:mysql://blah blah" /> 
     <property name="username" value="" /> 
     <property name="password" value="" /> 
     <property name="suppressClose" value="true" /> 
     <property name="autoCommit" value="true" /> 
    </bean> 

    <!-- Session Factory --> 
    <bean id="sessionFactory" 
     class="org.springframework.orm.hibernate3.annotation.AnnotationSessionFactoryBean"> 
     <property name="dataSource" ref="dataSource" /> 
     <property name="packagesToScan" value="au.com.sharleepark.domain" /> 
     <property name="hibernateProperties"> 
      <props> 
       <prop key="hibernate.dialect">org.hibernate.dialect.MySQLDialect</prop> 
       <prop key="hibernate.hbm2ddl.auto">validate</prop> 
       <prop key="show_sql">true</prop> 
      </props> 
     </property> 
    </bean> 

    <!-- Data Access Objects --> 
    <!-- <bean id="hibernateDAO" class="au.com.sharleepark.hibernate.HibernateDaoImpl"> 
     <property name="sessionFactory" ref="sessionFactory" /> 
    </bean> --> 

    <!-- Transaction management --> 
    <bean id="transactionManager" class="org.springframework.orm.hibernate3.HibernateTransactionManager"> 
     <property name="sessionFactory" ref="sessionFactory" /> 
    </bean> 

    <!-- Spring exception translation post processor for the DAO layer --> 
    <bean class="org.springframework.dao.annotation.PersistenceExceptionTranslationPostProcessor"/> 

</beans> 

feder security.xml

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

    <http pattern="/static/**" security="none" /> 

    <http use-expressions="true"> 
     <intercept-url pattern="/admin/login" access="permitAll" /> 
     <intercept-url pattern="/admin/**" access="isAuthenticated()" /> 
     <intercept-url pattern="/**" access="permitAll" /> 
     <form-login login-page="/admin/login" /> 
     <logout /> <!-- Not there is currently a logout link anyway --> 
    </http> 

    <authentication-manager> 
     <authentication-provider> 
      <user-service> 
       <user name="rod" password="koala" authorities="supervisor, teller, user" /> 
      </user-service> 
     </authentication-provider> 
    </authentication-manager> 
</beans:beans> 

web.xml

<?xml version="1.0" encoding="UTF-8"?> 
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
xmlns="http://java.sun.com/xml/ns/javaee" xmlns:web="http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd" 
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd" 
id="WebApp_ID" version="3.0" metadata-complete="true"> 

    <display-name>Sharlee Park</display-name> 

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

    <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> 
    </filter-mapping> 

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

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

adminLoginController.java (Controller)

package au.com.sharleepark.controller.admin; 

import org.apache.log4j.Logger; 
import org.springframework.stereotype.Controller; 
import org.springframework.web.bind.annotation.RequestMapping; 
import org.springframework.web.bind.annotation.RequestParam; 
import org.springframework.web.servlet.ModelAndView; 

/** 
* Controller class for the administration login 
* @author Steve 
* @version 1.00 
* 
* Change History 
* 08/11/12 - Created 
*/ 
@Controller 
@RequestMapping(value="admin") 
public class AdminLoginController { 

    private static final Logger logger = Logger.getLogger(AdminLoginController.class); 

    @RequestMapping(value="/login") 
    public ModelAndView doView(@RequestParam(value="error", required=false) boolean error) { 
     logger.info("processing Login"); 

     ModelAndView mav = new ModelAndView(); 
     mav.setViewName("admin/login"); 

     if (error) { 
      logger.error("Invalid Credentials"); 
      mav.addObject("error", "Invalid login credentials"); 
     } 
     return mav; 
    } 
} 

adminLogin.jsp

<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %> 
<div id="login"> 
    <div id="loginContent"> 
     <div class="error">${error}</div> 
     <form name='sharleeParkLoginForm' action="<c:url value='j_spring_security_check' />" method='POST'> 
      <fieldset> 
       <ul class="fieldUL"> 
        <li> 
         <label class="inputLabel" for="j_username">Username</label> 
         <span> 
          <input class="inputField" type="text" tabindex="1" id="j_username" name="j_username" size="25" maxlength="25"> 
         </span> 
        </li> 
       </ul> 
       <ul class="fieldUL"> 
        <li> 
         <label class="inputLabel" for="spPassword">Password</label> 
         <span> 
          <input class="inputField" type="password" tabindex="2" id="j_password" name="j_password" size="25" maxlength="25"> 
         </span> 
        </li> 
       </ul> 
       <ul class="fieldUL"> 
        <li><input name="submit" type="submit" value="Login"></li> 
       </ul> 
      </fieldset> 
     </form> 
     </div> 
</div> 

tiles.xml

<?xml version="1.0" encoding="UTF-8" ?> 
<!DOCTYPE tiles-definitions PUBLIC 
    "-//Apache Software Foundation//DTD Tiles Configuration 2.0//EN" 
    "http://tiles.apache.org/dtds/tiles-config_2_0.dtd"> 

<tiles-definitions> 
    <definition name="base.definition" template="/WEB-INF/jsp/layout.jsp"> 
     <put-attribute name="title" value="" /> 
     <put-attribute name="header" value="/WEB-INF/jsp/header.jsp" /> 
     <put-attribute name="body" value="" /> 
    </definition> 

.... 

    <!-- ADMIN PAGES --> 
    <definition name="admin/login" extends="base.definition"> 
     <put-attribute name="title" value="Administration Login" /> 
     <put-attribute name="body" value="/WEB-INF/jsp/admin/adminLogin.jsp" /> 
    </definition> 
.... 

</tiles-definitions> 

Antwort

0

Ich habe es ausgearbeitet. Das Problem wurde behoben, indem das login-processing-url="/admin/j_spring_security_check"-Attribut zum <form-login>-Tag hinzugefügt wurde. Ich habe noch nicht mit Spring Security gearbeitet und ich nehme an, dass ich einfach angenommen habe, dass die Filter magisch finden und entsprechend verarbeiten würden. Vielleicht nehmen die Filter es auf, wenn die j_spring_security_check stammt von der Root-URI (dh/sharleepark/j_spring_security_check) der Anwendung? Ich habe nie die Notwendigkeit gesehen, login-processing-url in einem der Tutorials, die ich mir angesehen habe, zu spezifizieren. Nochmals vielen Dank für ihren Beitrag.

+1

Down vote? Zugegeben, ich war sehr sehr neu in Spring Security, aber wenn Sie unten abstimmen, bitte kommentieren Sie mich und andere können davon profitieren. – DecafCoder

0

Ich wette, etwas mit der Sicherheitskonfiguration falsch ist.

Warum verwenden Sie use-expressions = "true" in Ihrer http-Deklaration? Ich sehe nicht, dass Sie Spring-EL-Ausdrücke verwenden ... versuchen Sie, es zu entfernen und sehen Sie, ob sich etwas ändert.

+0

Soweit ich weiß (und nach [link] (http://static.springsource.org/spring-security/site/docs/3.0.x/reference/el-access.html)) müssen Sie used-expressions benutzen 'allowAll' und' isAuthenticated() '? Wie auch immer, ich habe versucht, 'use-expressions 'zu entfernen und bekomme eine' java.lang.IllegalArgumentException ': Nicht unterstützte Konfigurationsattribute: [allowAll, isAuthenticated(), none]' muss also erforderlich sein. All meine Sicherheitskonfiguration wird gepostet, wenn es in der Konfiguration ist, ist es etwas darüber. – DecafCoder

+0

können Sie hier http://static.springsource.org/spring-security/site/docs/3.1.x/reference/springsecurity-single.html#d0e5432 sehen, dass allow und isAuthenticated() eingebaute Ausdrücke sind ... Wie auch immer, nur für den Test, loswerden der Verwendung Ausdrücke = "wahr" und versuchen, access = "ROLE_USER" zu verwenden und zu sehen, ob es eine Änderung gibt – OhadR

+0

'use-Ausdrücke' ist noch erforderlich, um eingebaute Ausdrücke zu verwenden. Ich habe versucht, Ihre Vorschläge für und ohne 'use-expression' IllegalArgumentExceptions geworfen werden, so glaube ich leider nicht, dass es – DecafCoder

8

Versuchen Sie <http auto-config="true" use-expressions="true"> zu verwenden.

Von Dokumentation über httpauto-config Attribut:

registriert automatisch ein Login-Formular, BASIC-Authentifizierung, die anonyme Authentifizierung, logout Dienste, erinnert-me und Servlet-API-Integration. Wenn diese Option auf "true" gesetzt ist, werden alle diese Funktionen hinzugefügt (Sie können jedoch die Konfiguration der einzelnen Funktionen anpassen, indem Sie das entsprechende Element bereitstellen). Wenn nicht angegeben, wird standardmäßig "false" angegeben.

+0

Sorry ich hätte erwähnt werden, dass ich' auto-config = "true" 'auch versucht hatte. Leider hindert es mich nicht daran, mich auf die Anmeldeseite zu bringen. – DecafCoder

0

Im Allgemeinen behandeln wir nicht die /login Zuordnung in der Steuerung. Spring Security übernimmt die Anmeldeauthentifizierung und leitet die erfolgreiche URL weiter. Sie können den View-Namen für die Login-Seite in der spring-config.xml wie folgt angeben.

<mvc:view-controller path="/login" view-name="login"/> 

und Sie können die erfolgreiche URL-Zuordnung in der Controller-Klasse behandeln. Wenn Sie in diesem Fall default-target-url="admin/forSale" angeben, schreiben Sie eine Methode, um das /forSale Mapping zu behandeln.

Ich denke becaue Sie die ‚/ login‘ Mapping in der Steuerung sind Handling seiner sowohl für Erfolg und Misserfolg auf der Login-Seite geleitet wird ..

ModelAndView mav = new ModelAndView(); 
mav.setViewName("admin/login"); 

Doch statt, wenn kein Fehler ist dann die Ansicht sollte anders sein mav.setViewName("admin/forSale")

+0

Danke, ich dachte, das würde es beheben, da ich dachte, dass es etwas mit der Controller-Zuordnung zu tun hat. Ich hatte versucht, den Controller aus dem Bild zu entfernen, aber ich wusste nicht, dass Sie '' verwenden konnten. Dieses Mal habe ich den ' hinzugefügt 'aber es hat immer noch nicht funktioniert. Ich konnte die Sicherheitsverarbeitung nicht abmelden, deshalb schreibe ich einen schnellen Filter, um etwas Logging hinzuzufügen, um besser zu verstehen, was vor sich geht. Hoffentlich wird das die Situation etwas beleuchten. – DecafCoder