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.
Welchen Fehler bekommen Sie? Stapelverfolgung? – FreezY
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
'/ login' ist eigentlich' UsernamePasswordAuthenticationFilter ', das im Frühling Sicherheit existiert. Du kannst meine Antwort versuchen. – FreezY