hallo Ich versuche, ein einfaches Beispiel zu folgen über eine einfache Login-Formular Seite zu tun, dass ich in dieser Seite ist http://docs.spring.io/autorepo/docs/spring-security/4.0.x/guides/form.html
Einfaches Beispiel von Spring Security mit Thymeleaf
das Problem festgestellt, dass du Sein diese Fehler jedes Mal bekommen, dass ich versuche, um sich einzuloggen ich diese Fehlermeldung erhalten: Expected CSRF token not found. Has your session expired?
wenn ich diesen Fehler i drücken Sie die zurück-Taste in meinem Explorer und versuchen, ein zweites Mal anmelden und wenn ich das tue, dass ich diesen Fehler: HTTP 403 - Invalid CSRF Token 'null' was found on the request parameter '_csrf' or header 'X-CSRF-TOKEN'
In der Tutorial-Seite ist diese Nachricht: We use Thymeleaf to automatically add the CSRF token to our form. If we were not using Thymleaf or Spring MVCs taglib we could also manually add the CSRF token using <input type="hidden" name="${_csrf.parameterName}" value="${_csrf.token}"/>
„so, weil ich auch bin mit thymeleaf ich habe nicht den Tag auf meine Seite hinzufügen“
ich eine andere Lösung gefunden und es funktioniert, und diese Lösung ist, diese zu meiner Sicherheitskonfigurations Klasse .csrf().disable()
diese Lösung funktioniert, aber ich nehme an was das tun ist csrf Schutz in meiner Seite zu deaktivieren, und ich möchte diese Art von Schutz nicht deaktivieren.
das ist meine Sicherheits-config-Klasse:
@Configuration
@EnableWebSecurity
public class ConfigSecurity extends WebSecurityConfigurerAdapter {
@Autowired
public void configureGlobal(AuthenticationManagerBuilder auth) throws Exception {
auth
.inMemoryAuthentication()
.withUser("user").password("password").roles("USER");
}
@Override
protected void configure(HttpSecurity http) throws Exception {
http
//.csrf().disable() is commented because i dont want disable this kind of protection
.authorizeRequests()
.anyRequest().authenticated()
.and()
.formLogin()
.loginPage("/login")
.permitAll()
.and()
.logout()
.permitAll();
}
}
meine Sicherheit initialzer:
public class InitSecurity extends AbstractSecurityWebApplicationInitializer {
public InicializarSecurity() {
super(ConfigSecurity .class);
}
}
meine app-config-Klasse, wo ich meine thymeleaf Konfiguration
@EnableWebMvc
@ComponentScan(basePackages = {"com.myApp.R10"})
@Configuration
public class ConfigApp extends WebMvcConfigurerAdapter{
@Override
public void addResourceHandlers(ResourceHandlerRegistry registry) {
registry.addResourceHandler("/css/**").addResourceLocations("/css/**");
registry.addResourceHandler("/img/**").addResourceLocations("/img/**");
registry.addResourceHandler("/js/**").addResourceLocations("/js/**");
registry.addResourceHandler("/sound/**").addResourceLocations("/sound/**");
registry.addResourceHandler("/fonts/**").addResourceLocations("/fonts/**");
}
@Override
public void configureDefaultServletHandling(DefaultServletHandlerConfigurer configurer) {
configurer.enable();
}
@Bean
public MessageSource messageSource() {
ReloadableResourceBundleMessageSource messageSource = new ReloadableResourceBundleMessageSource();
messageSource.setBasenames("classpath:messages/messages");
messageSource.setUseCodeAsDefaultMessage(true);
messageSource.setDefaultEncoding("UTF-8");
messageSource.setCacheSeconds(0);// # -1 : never reload, 0 always reload
return messageSource;
}
// THYMELEAF
@Bean
public ServletContextTemplateResolver templateResolver() {
ServletContextTemplateResolver resolver = new ServletContextTemplateResolver();
resolver.setPrefix("/WEB-INF/views/pagLogin/");
resolver.setSuffix(".html");
resolver.setTemplateMode("HTML5");
resolver.setOrder(0);
resolver.setCacheable(false);
return resolver;
}
@Bean
public SpringTemplateEngine templateEngine() {
SpringTemplateEngine engine = new SpringTemplateEngine();
engine.setTemplateResolver(templateResolver());
engine.setMessageSource(messageSource());
return engine;
}
@Bean
public ThymeleafViewResolver thymeleafViewResolver() {
ThymeleafViewResolver resolver = new ThymeleafViewResolver();
resolver.setTemplateEngine(templateEngine());
resolver.setOrder(1);
resolver.setCache(false);
return resolver;
}
@Bean
public SpringResourceTemplateResolver thymeleafSpringResource() {
SpringResourceTemplateResolver vista = new SpringResourceTemplateResolver();
vista.setTemplateMode("HTML5");
return vista;
}
}
meine app -config Initialisierung
public class InicializarApp extends AbstractAnnotationConfigDispatcherServletInitializer {
@Override
protected Class<?>[] getRootConfigClasses() {
return null;
}
@Override
protected Class<?>[] getServletConfigClasses() {
return new Class[] { ConfigApp .class };
}
@Override
protected String[] getServletMappings() {
return new String[]{"/"};
}
@Override
protected Filter[] getServletFilters() {
return new Filter[] { new HiddenHttpMethodFilter() };
}
}
Anmeldungs Controller-Klasse
@Controller
public class ControllerLogin {
@RequestMapping(value = "/login", method = RequestMethod.GET)
public String pageLogin(Model model) {
return "login";
}
my home Controller-Klasse
@Controller
public class HomeController {
@RequestMapping(value = "/", method = RequestMethod.GET)
public String home(Model model) {
return "home";
}
}
mein login.html
<html xmlns:th="http://www.thymeleaf.org" xmlns:tiles="http://www.thymeleaf.org">
<head>
<title tiles:fragment="title">Messages : Create</title>
</head>
<body>
<div tiles:fragment="content">
<form name="f" th:action="@{/login}" method="post">
<fieldset>
<legend>Please Login</legend>
<div th:if="${param.error}" class="alert alert-error">
Invalid username and password.
</div>
<div th:if="${param.logout}" class="alert alert-success">
You have been logged out.
</div>
<label for="username">Username</label>
<input type="text" id="username" name="username"/>
<label for="password">Password</label>
<input type="password" id="password" name="password"/>
<div class="form-actions">
<button type="submit" class="btn">Log in</button>
</div>
<!-- THIS IS COMMENTED it dont work beacuse i am already using thymeleaf <input type="hidden" name="${_csrf.parameterName}" value="${_csrf.token}"/> -->
</fieldset>
</form>
</div>
</body>
</html>
meine home.html Seite zeigt nur, nachdem ich dich anmelden und Die einzige Möglichkeit, wie ich mich anmelden kann, ist eine .csrf(). disable() in meiner Sicherheits-Config-Klasse, aber ich möchte nicht deaktivieren dieser Schutz, wenn ich das nicht in meine Sicherheitskonfiguration Klasse bringe, bekomme ich die Fehler, die ich am Anfang dieser Frage erwähne.
danke Mann, es hat funktioniert, ich weiß nicht, warum das Tutorial sagt: "" Wir verwenden Thymeleaf, um den CSRF-Token automatisch zu unserem Formular hinzuzufügen. Wenn wir Thymleaf oder Spring MVCs taglib nicht verwenden, können wir das CSRF-Token auch manuell hinzufügen, indem wir "" aber du versuchst was du sagst und es hat funktioniert – stackUser2000
Welche Spring, Spring Security und Thymeleaf Versionen verwendest du für dein Projekt? – manish
Frühling Version: 4.0.6.RELEASE ----- thymeleaf: 2.1.3.RELEASE ----- thymeleaf-Spring4: 2.1.3.RELEASE ----- Frühling secuirty web: 3.2.5.RELEASE ----- feder-security-config: 3.2.4.RELEASE – stackUser2000