您好我正在尝试使用JSP作为视图引擎来实现Spring启动Web应用程序。我以本教程为基础:http://www.mkyong.com/spring-security/spring-security-hello-world-annotation-example/我知道教程没有使用弹簧启动。无论如何,我设法实现了一个基本的登录功能。但问题是,当我尝试注销时,它不起作用并向我显示"白标签错误页面"消息说"此应用程序没有/ error的显式映射,因此您将此视为后备。"并且不显示任何其他特定消息。
例如,当我尝试登录" admin"被保护页面的页面。登录页面出现,我可以成功登录。但是当我点击退出时,出现上述错误,并且在控制台上也没有显示任何错误。当我转到上一个网址" / admin"时,它仍然显示它已与之前的用户一起登录。
由于它在控制台和网页上没有显示任何错误,因此我无法调试此问题。我是Spring网络应用程序的新手,所以请解释一下我的错误以及如何解决这个问题。
这是我的主要Application.java文件
@ComponentScan
@EnableAutoConfiguration
public class Application extends SpringBootServletInitializer {
private static final Logger LOGGER = LoggerFactory.getLogger(Application.class.getName());
@Override
protected SpringApplicationBuilder configure(SpringApplicationBuilder application) {
return application.sources(Application.class);
}
public static void main(String[] args) {
LOGGER.info("Starting Main Application...");
SpringApplication.run(Application.class, args);
LOGGER.info("Access URLs: http://127.0.0.1:8080\n");
}
}
这是我的application.properties文件
spring.mvc.view.prefix= /WEB-INF/jsp/
spring.mvc.view.suffix= .jsp
这是我的SecurityConfig.java文件
@Configuration
@EnableWebSecurity
public class SecurityConfig extends WebSecurityConfigurerAdapter {
@Autowired
public void configureGlobal(AuthenticationManagerBuilder auth) throws Exception {
auth.inMemoryAuthentication().withUser("admin").password("admin").roles("ADMIN");
auth.inMemoryAuthentication().withUser("user").password("user").roles("USER");
}
@Override
protected void configure(HttpSecurity http) throws Exception {
http.authorizeRequests()
.antMatchers("/admin/**").access("hasRole('ADMIN')")
.antMatchers("/user/**").access("hasRole('ADMIN') or hasRole('USER')")
.antMatchers("/index").permitAll()
.antMatchers("/").permitAll()
.and()
.formLogin()
.and()
.logout()
.logoutSuccessUrl("/");
}
}
这是我的MainController.java
@Controller
public class MainController {
private static final Logger LOGGER = LoggerFactory.getLogger(MainController.class);
@RequestMapping({"/index", "/"})
public String index(Model model) {
model.addAttribute("title", "Spring Web Application example");
model.addAttribute("message", " This is Spring Web Application example using Spring boot, JSP");
LOGGER.debug("Inside MainController.index() method");
return "index";
}
@RequestMapping(value = "/admin**", method = RequestMethod.GET)
public String adminPage(Model model) {
model.addAttribute("title", "Spring Security Web Application example");
model.addAttribute("message", "This is a protected page");
model.addAttribute("h2", "only user with ADMIN role should be able to access this page!");
return "admin";
}
@RequestMapping(value = "/user**", method = RequestMethod.GET)
public String userPage(Model model) {
model.addAttribute("title", "Spring Security Web Application example");
model.addAttribute("message", "This is a protected page");
model.addAttribute("h2", "only user with either USER or ADMIN role should be able to access this page!");
return "user";
}
}
我排除了jsp文件和pom文件,如果你想查看整个项目,请查看我的github存储库https://github.com/agthumoe/spring-boot-security
由于
答案 0 :(得分:1)
作为said in documentation,默认启用CSRF保护。这意味着,只有/logaout
请求才能访问post
。邮政请求必须包含CSRF令牌。所以,你可以做以下事情:
<form action="/logout" method="post">
<input type="hidden" name="${_csrf.parameterName}" value="${_csrf.token}"/>
<input type="submit" value="Log out" />
</form>
这个表格只是一个例子。当然,您可以通过点击链接删除按钮并使用javascript提交。
作为另一种解决方案,您可以禁用CSRF保护(在安全性方面不是一个好主意):
@Configuration
@EnableWebSecurity
public class SecurityConfig extends WebSecurityConfigurerAdapter {
....
@Override
protected void configure(HttpSecurity http) throws Exception {
http.
.csrf().disable()
.authorizeRequests()
....;
}
}