Spring Security - logowanie

0

Witam,
mam problem z logowaniem i nie potrafie go naprawić:

login.jsp

<%@page pageEncoding="UTF-8" contentType="text/html; charset=UTF-8"%>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%>
<%@ taglib prefix="form" uri="http://www.springframework.org/tags/form"%>
<%@ taglib prefix="spring" uri="http://www.springframework.org/tags"%>

<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<link rel="stylesheet" href="//netdna.bootstrapcdn.com/bootstrap/3.0.0/css/bootstrap.min.css">
<title><spring:message code="labels.products.title" /></title>
</head>

<body>
	<section>
		<div class="container">
			<div class="row">
				<div class="col-md-4 col-md-offset-4">
					<div class="panel panel-default">
						<div class="panel-heading">
							<h3 class="panel-title"> <spring:message code="labels.login.login"/> </h3>
						</div>
						<div class="panel-body">
							<c:if test="${not empty error}">
								<div class="alert alert-danger">
									<spring:message code="labels.login.error.passowrd" />
								</div>
							</c:if>
							<form action="<c:url value="/j_spring_security_check"></c:url>" method="post">
								<fieldset>
									<div class="gorm=group">
										<input class="form-control" placeholder=<spring:message code="labels.login.login"/> name='j_username' type="text">
									</div>
									<div class="form-group">
										<input class="form-control" placeholder=<spring:message code="labels.login.password"/> name='j_password' type="password" value="">
									</div>
									<input class="btn btn-lg btn-success btn-block" type="submit" value=<spring:message code="labels.login.login"/>>
								</fieldset>
							</form>
						</div>
					</div>
				</div>
			</div>
		</div>
	</section>
</body>
</html>

security-context.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:security="http://www.springframework.org/schema/security"
	xsi:schemaLocation="http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc-4.0.xsd
		http://www.springframework.org/schema/security http://www.springframework.org/schema/security/spring-security-4.0.xsd
		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-4.0.xsd">
		
	<security:http auto-config="true">
		<security:intercept-url pattern="/products/add" access="hasRole('ROLE_ADMIN')" />
		
		<security:form-login login-page="/login" 
               default-target-url="/products/add"   
               authentication-failure-url="/loginfailed"/>
        <security:logout logout-success-url="/logout" />
	</security:http>
	
	<security:authentication-manager>
		<security:authentication-provider>
			<security:user-service>
				<security:user name="Admin" password="Admin123" authorities="ROLE_ADMIN" />
			</security:user-service>
		</security:authentication-provider>
	</security:authentication-manager>
</beans>

LoginController.java

package com.packt.webstore.controller;

import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;

@Controller
public class LoginController {
	
	@RequestMapping(value = "/login", method = RequestMethod.GET)
	public String login() {
		return "login";
	}

	@RequestMapping(value = "/loginfailed", method = RequestMethod.GET)
	public String loginerror(Model model) {

		model.addAttribute("error", "true");
		return "login";

	}

	@RequestMapping(value = "/logout", method = RequestMethod.GET)
	public String logout(Model model) {
		return "login";
	}
}

Blad:

HTTP Status 403 - Invalid CSRF Token 'null' was found on the request parameter '_csrf' or header 'X-CSRF-TOKEN'.

mógłby mi ktoś pomoc i wyjasnic co jest nie tak

0

Albo musisz dodać pole z csrf albo ustawić aby tego niesprawdzac. Jak wkleisz swój błąd w Google to otrzymasz milion odpowiedzi.

0

Pomyłka: w przypadku tagów JSTL : *Najpierw zmień niektóre atrybuty w kodzie HTML tak, żeby były zgodne z zaleceniami W3C, bo inaczej to nie będzie działać. Chodzi o te atrybuty, w których wartościach używać tagów JSTL. W przypadku gdy wartość atrybutu jest w podwójnych cudzysłowiach - wtedy nie możesz w środku używać podwójnych cudzysłowiów jako częsci wartości, bo przeglądarki rozumieją to tak, że wtedy wskazujesz koniec wartości. To tak samo jak w javie nie możesz przypisać do Stringa wartości "aby dodać dwie zmienne użyj znaku "+" ", bo kompilator to zrozumie jako połączenie dwóch stringów. Zmień to. Tutaj masz restrykcje dotyczące atrubutów HTML: https:*www.w3.org/TR/html-markup/syntax.html#syntax-attributes

Wystarczy zamiast zagnieżdżonych podwójnych cudzysłowiów, użyć pojedyńczych, czyli np:
action="<c:url value='j_spring_security_check' />"//

Spring Security domyślnie używa ochrony przed atakami CSRF. Czyli domyślnie jest ustawiony csrf token. Możesz go wyłączyć w konfiguracji SS, wewnątrz tagów html:

<csrf disabled="true"/>

albo dodać token w formularzu za pomocą:

<input type="hidden" name="${_csrf.parameterName}" value="${_csrf.token}" />

1 użytkowników online, w tym zalogowanych: 0, gości: 1