Spring Security 自定义登录功能不适用于 Spring Boot 和 REST api
Posted
技术标签:
【中文标题】Spring Security 自定义登录功能不适用于 Spring Boot 和 REST api【英文标题】:SpringSecurity custom login functionality doesn't work with SpringBoot and REST api 【发布时间】:2021-10-15 21:26:47 【问题描述】:我尝试使用自定义登录页面实现登录功能,但不幸的是它不起作用..我也找不到原因..可能我不完全了解 SpringSecurity 机制。看起来提交按钮什么都不做。我的代码如下。我会很乐意为您提供帮助。
login.html
<!DOCTYPE html>
<html lang="en" xmlns="http://www.w3.org/1999/html">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
<h1>test login page</h1>
<form name="login" action="/login" method="post">
User: <input type="text" name="username"/>
Password: <input type="password" name="password"/>
<input name="submit" type="submit" value="LOGIN"/>
<hr>
<button id="loginAsGuest">Login as a guest</button>
</form>
</body>
</html>
WebSecurityConfig.java:
@Configuration
@EnableWebSecurity
public class WebSecurityConfig extends WebSecurityConfigurerAdapter
@Override
protected void configure(AuthenticationManagerBuilder auth) throws Exception
auth.inMemoryAuthentication()
.withUser("admin").password("noopadmin").roles("ADMIN")
.and()
.withUser("userguest").password("noopuserguest").roles("USER");
@Override
protected void configure(HttpSecurity http) throws Exception
http
.csrf().disable()
.authorizeRequests()
.antMatchers("/").hasAnyRole("ADMIN")
.antMatchers("/").hasAnyRole("USER")
.antMatchers("/login*").permitAll()
.anyRequest().authenticated()
.and()
.formLogin().loginPage("/login.html")
.defaultSuccessUrl("/bookmarks-app/index.html", true)
.failureUrl("/login.html")
.and()
.logout().permitAll().logoutRequestMatcher(new AntPathRequestMatcher("/logout")
);
【问题讨论】:
不幸的是,这并没有解决我的问题。 什么不起作用?当你登录时,它给你一个错误?不重定向你吗?什么都没发生? Whitelabel 错误页面 此应用程序没有明确的 /error 映射,因此您将其视为后备。 Sun Aug 15 21:35:16 CEST 2021 出现意外错误(type=Method Not Allowed,status=405)。 【参考方案1】:只是指出一些事情。
hasAnyRole 支持多个角色,所以你可以这样写.antMatchers("/**").hasAnyRole("ADMIN", "USER")
如果你放/**每个rest服务都会触发角色检查,如果你只放/只有/rest服务会触发检查。
删除 .antMatchers("/login*").permitAll()
并将.loginPage("/login.html")
替换为.loginPage("/login").permitAll()
最后你的配置会是这样的:
@Override
protected void configure(HttpSecurity http) throws Exception
http
.csrf().disable()
.authorizeRequests()
.antMatchers("/**").hasAnyRole("ADMIN", "USER")
.anyRequest().authenticated()
.and()
.formLogin().loginPage("/login.html").permitAll().loginProcessingUrl("/perform_login")
//No need to add a LoginController.
// Needed because if you don't put this, when you call the POST to login you will be redirected to the login.html page.
.defaultSuccessUrl("/bookmarks-app/index.html", true)
.failureUrl("/login.html").permitAll()
.and()
.logout().permitAll().logoutRequestMatcher(new AntPathRequestMatcher("/logout")
);
如果你的登录页面在资源中,别忘了正确配置ResourceHandler。
来源:
https://docs.spring.io/spring-security/site/docs/4.1.3.RELEASE/guides/html5/form-javaconfig.html
How to use Spring Security to custom login page?
【讨论】:
不幸的是,它又回到了登录页面。 我测试了提供的解决方案,对我有用,你有什么改变吗? 我按照你上面的描述直接试试代码。所以可能我在其他地方做错了什么......这是我在 github 上的回购:github.com/krzysztofskul/bookmarks-app @krzysztofskul 让我知道修复(在 github 上)是否适合您,它应该因为代码现在完全一样 现在可以使用了,谢谢!抱歉没有回复,我确定我已经回复了。以上是关于Spring Security 自定义登录功能不适用于 Spring Boot 和 REST api的主要内容,如果未能解决你的问题,请参考以下文章
Spring-Security 自定义Filter完成验证码校验