2016-03-31 19 views
2

Ich bin neu in Spring und ich brauche Hilfe bei der Authentifizierung mit Spring Security. Auch wenn es jemand kann, wäre es gut, einige Momente zu klären (ich werde sie mit (# {1- ..}) markieren), weil es am Anfang viele "magische" und seltsame Dinge für mich gibt ., auch nach Tutorials und Dokumentation Lesen = (So verwenden Sie Authentifizierungsprovider Spring Security?

Also, ich versuche AuthenticationProvider zu implementieren und wenn ich alles richtig in authenticate() -Methode verstehen kann ich meine spezielle Authentifizierungslogik organisieren Also mein Code wie folgt aussieht:.

((# 1) Wenn ich richtig verstehe, Spring automatisch Bean mit Name Wert = "customAuth" und es gibt keine Notwendigkeit, über diese Bean in irgendeiner Kontextdatei zu erzählen. Habe ich Recht?) CustomAuthenticationProvider:

@Service(value = "customAuth") 
public class CustomAuthenticationProvider implements AuthenticationProvider{ 
    @Autowired 
    public Storages storage; 

    @Override 
    @Transactional 
    public Authentication authenticate(Authentication authentication) throws AuthenticationException { 
    String login = authentication.getName(); 
    String password = authentication.getCredentials().toString(); 
    final User user = storage.uSM.findByAuthorization(login, password); 
    if (user==null){ 
     return null; 
    } else { 
     return new UsernamePasswordAuthenticationToken(login, password); 
    } 
    } 

    @Override 
    public boolean supports(Class<?> authentication) { 
    return authentication.equals(UsernamePasswordAuthenticationToken.class); 
    } 
} 

web.xml

<?xml version="1.0" encoding="UTF-8"?> 
<web-app version="2.5" xmlns="http://java.sun.com/xml/ns/javaee"> 
    <servlet> 
    <servlet-name>appServlet</servlet-name> 
    <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class> 
    <init-param> 
     <param-name>contextConfigLocation</param-name> 
     <param-value> 
     classpath:/resources/spring-context.xml 
     classpath:/resources/spring-security.xml 
     </param-value> 
    </init-param> 
    <load-on-startup>1</load-on-startup> 
    </servlet> 

    <servlet-mapping> 
    <servlet-name>appServlet</servlet-name> 
    <url-pattern>/</url-pattern> 
    </servlet-mapping> 

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

    <context-param> 
    <param-name>contextConfigLocation</param-name> 
    <param-value> 
     classpath:/resources/spring-context.xml 
     classpath:/resources/spring-security.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>/secret/page</url-pattern> 
    </filter-mapping> 
    <mvc:default-servlet-handler/> 
</web-app> 

feder security.xml:

<beans:beans xmlns:beans="http://www.springframework.org/schema/beans" 
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
    xmlns="http://www.springframework.org/schema/security" 
    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.xsd"> 

    <http auto-config="true" use-expressions="true"> 
    <intercept-url pattern="/secret/page" access="isAuthenticated()"/> 
    <form-login 
     login-page="/sign/in" 
     default-target-url="/secret/page" 
     authentication-failure-url="/sign/in" 
     password-parameter="password" 
     username-parameter="username" 
    /> 
    </http> 

    <authentication-manager> 
    <authentication-provider ref="customAuth"/> 
    </authentication-manager> 
</beans:beans> 

Der nächste ist mit meiner benutzerdefinierten Login-Formular meine in.jsp Datei. Wie ich gelesen habe, wird dieses Formular an den/Login-Standard gesendet werden (ich weiß, dass wir es ändern können, indem Sie login-processing-url). Die zweite Frage (# 2) handelt von diesem "/ login". Wie ich es verstehe, wenn wir unser Formular an/login senden, senden wir es an einige von Spring erstellte Klassen, die es verwalten und notwendige Daten an AuthorizationProvider geben, die wir hier einstellen: <authentication-provider ref="customAuth"/>? Oder ich liege falsch? Wie auch immer, es funktioniert nicht. A habe viele Varianten ausprobiert, aber keiner funktioniert nicht. Also hier ist es meine in.jsp:

<%@page contentType="text/html" pageEncoding="UTF-8"%> 
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %> 
<!DOCTYPE html> 
<html> 
    <head> 
     <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> 
     <title>JSP Page</title> 
    </head> 
    <body> 
    <c:if test="${failed==1}"> 
     <font color="red"> 
     Authentication failed. Wrong email/password. 
     </font> 
    </c:if> 

    <form action="${pageContext.servletContext.contextPath}/login" method="POST"> 
     <label> E-mail </label> 
     <input type="email" name="username" required><br> 
     <label> Password </label> 
     <input type="password" name="password" required><br> 
     <input type="submit" value="Sign in"><br> 
    </form> 
    </body> 
</html> 

und In.java @Controller:

@Controller 
@RequestMapping ("/sign/in") 
public class In { 
    @RequestMapping (method = {RequestMethod.GET}) 
    public String showForm(@RequestParam(required = false) Integer failed, ModelMap model){ 
    model.addAttribute("failed", failed); 
    return "sign/in"; 
    } 
} 

In diesem Fall, nachdem ich meine Form POST, es leitet mich/login und 404 Fehler auftreten, weil es nicht existiert.

Also kann jemand helfen, es zu beheben? Ich werde alle Erklärungen, Links und Ideen zu schätzen wissen. Danke im Voraus.

+0

Welchen Fehler bekommen Sie? Stapelverfolgung? – FreezY

+0

Eigentlich bekomme ich 404 Fehler, wenn ich versuche, mein Login-Formular zu senden, weil es versucht, mich zu verweisen/Login-Seite, die nicht existiert. – Nickolas

+1

'/ login' ist eigentlich' UsernamePasswordAuthenticationFilter ', das im Frühling Sicherheit existiert. Du kannst meine Antwort versuchen. – FreezY

Antwort

0

Alternative Lösung:

(# 1) Sie sollten die Bohne mit „CustomAuth“ als ID erstellen, da Frühling auf diese ID verweisen die CustomAuthenticationProvider Klasse zu verwenden und lassen Sie einfach @Service ohne Parameter sollte den Trick. (können Sie versuchen, wenn Sie wollen)

(# 2) Nachdem Sie die Login-Seite einreichen in.jsp, spring die Informationen in login-processing-url=/login Ereignis verarbeiten werden Sie in Ihrem <form-login> erklären nicht. Und ja, Frühling bezieht sich auf CustomAuthenticationProvider. Wenn Ihr Login erfolgreich war, wird Spring Sie zu default-target-url="/secret/page" umleiten. Wenn die Anmeldung fehlgeschlagen ist, wird auf die verfügbare zulässige Seite umgeleitet.

habe ich

Bahn einen Teil des Codes ändern. xml

<?xml version="1.0" encoding="UTF-8"?> 
<web-app version="2.5" xmlns="http://java.sun.com/xml/ns/javaee"> 
<servlet> 
<servlet-name>appServlet</servlet-name> 
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class> 
<init-param> 
    <param-name>contextConfigLocation</param-name> 
    <param-value> 
    classpath:/resources/spring-context.xml 
    classpath:/resources/spring-security.xml 
    </param-value> 
</init-param> 
<load-on-startup>1</load-on-startup> 
</servlet> 

<servlet-mapping> 
<servlet-name>appServlet</servlet-name> 
<url-pattern>/</url-pattern> 
</servlet-mapping> 

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

<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> 
<mvc:default-servlet-handler/> 

feder security.xml

<beans:beans xmlns:beans="http://www.springframework.org/schema/beans" 
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
xmlns="http://www.springframework.org/schema/security" 
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.xsd"> 

<http auto-config="true" use-expressions="true"> 
<intercept-url pattern="/sign/in" access="permitAll()" /> 
<intercept-url pattern="/**" access="isAuthenticated()" /> 

<form-login 
    login-page="/sign/in" 
    default-target-url="/secret/page" 
    authentication-failure-url="/sign/in" 
    password-parameter="password" 
    username-parameter="username" 
/> 
</http> 

<authentication-manager> 
<authentication-provider ref="customAuth"/> 
</authentication-manager> 

<beans:bean id="customAuth" class="xx.xxx.xxxx.CustomAuthenticationProvider" /> 
</beans:beans> 

in.jsp

<%@page contentType="text/html" pageEncoding="UTF-8"%> 
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %> 
<!DOCTYPE html> 
<html> 
<head> 
    <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> 
    <title>JSP Page</title> 
</head> 
<body> 
<c:if test="${failed==1}"> 
    <font color="red"> 
    Authentication failed. Wrong email/password. 
    </font> 
</c:if> 

<form action="<c:url value='/login />'" method="POST"> 
    <label> E-mail </label> 
    <input type="email" name="username" required><br> 
    <label> Password </label> 
    <input type="password" name="password" required><br> 
    <input type="submit" value="Sign in"><br> 
</form> 
</body> 

Der Grund für 404 ist, dass Sie den Controller mit /secret/page definieren und die benötigte JSP-Datei zurückgeben müssen.

Hofft seine Hilfe.

+0

Vielen Dank für Ihre Hilfe und Erklärungen. Und es tut mir leid für eine lange Antwort. Es funktioniert jetzt gut und ich kann sehen, dass ich umgeleitet werde, um mich anzumelden/fehlgeschlagen ist = failed = 1, also funktioniert es (wahrscheinlich habe ich irgendwo in meiner Klasse einen Fehler gemacht, der mit der Datenbank funktioniert). – Nickolas

+0

Wenn Sie einen Parameter 'fehlgeschlagen' erhalten möchten, können Sie @RequestParam im Methoden-Controller hinzufügen, und Sie können den Wert von 'failed', welcome und gud luk bekommen :) – FreezY

Verwandte Themen