预置url和页面
之所以会有以上效果,是因为formLogin自动配置了一些url和页面:
- /login (get):登录页面,任意没有登录的请求都会跳转到这里,就是上面看到的那个页面。
- /login (post):登录接口,在登录页面点击登录,会请求这个接口。
- /login?error:用户名或密码错误,跳转到该页面。
- /:登录成功后,默认跳转的页面,/会重定向到index.html,这个页面要你自己实现。
- /logout:注销页面。
- /login?logout:注销成功跳转页面。
@SpringBootConfiguration
public class SecurityConfig extends WebSecurityConfigurerAdapter {
protected void configure(HttpSecurity http) throws Exception {
http
.authorizeRequests()//配置权限
.anyRequest().authenticated()//任意请求需要登录
.and()
.formLogin()//开启formLogin默认配置
.loginPage("/login/auth").permitAll()//请求时未登录跳转接口
.failureUrl("/login/fail")//用户密码错误跳转接口
.defaultSuccessUrl("/login/success",true)//登录成功跳转接口
.loginProcessingUrl("/login")//post登录接口,登录验证由系统实现
.usernameParameter("username") //要认证的用户参数名,默认username
.passwordParameter("password") //要认证的密码参数名,默认password
.and()
.logout()//配置注销
.logoutUrl("/logout")//注销接口
.logoutSuccessUrl("/login/logout").permitAll()//注销成功跳转接口
.deleteCookies("myCookie") //删除自定义的cookie
.and()
.csrf().disable(); //禁用csrf
}
- 未登录用户请求/hello会跳转到/login/auth接口,但这个接口本生也需要登录才能请求,所以其配置了permitAll允许任何人请求,包含未登录用户。/login/logout也是同理。其他接口没有配置permitAll,因为它们已经处于登录状态,或者会被特别处理,如登录接口只会被特定过滤器拦截处理,以后会讲。
- true:是指登录成功后,始终跳转到登录成功url。它默认为false,就像上面请求/hello时未登录,跳转到登录页面。而登录成功后又自动跳回到/hello,而不是跳转到登录url,这显然不符合前后端分离模式。
- 在登录时,如果手动创建了cookie,可以用deleteCookies方法删除。如果是系统自动创建的一些数据,在注销时系统会自动清理。如果还有cookie以外的自定义数据可在注销成功接口去清理。
- csrf().disable():csrf功能默认会开启,用于防止跨站伪造请求,以后会讲,现在先禁用,否则将无法登录。
spring security配置表单登录