近几天被一个朋友问道了一个loginProcessingUrl设置后无效的问题。
他的登陆页面的接口是 /loginpage
这个前端页面的登陆按钮请求的url是 /login/doLogin
前端页面代码如下
<form action="/login/doLogin" method="post">
<input type="text" name="username" />
<input type="password" name="password"/>
<button type="submit">登陆</button>
</form>
然后他在后端代码的的controller层写了一个与前端action相同的接口,代码如下
@RequestMapping(value = "/login/doLogin",method = RequestMethod.POST)
@ResponseBody
public Object adminlogindologin(String username,String password){
System.out.println(username);
System.out.println(password);
return "成功";
}
然后他发现这个接口无论如何都不会调用,我仔细观察了他的security的配置有没有问题,发现也没有,此时的security配置代码如下
@Override
protected void configure(HttpSecurity http) throws Exception {
http
.formLogin().loginProcessingUrl("/login/doLogin")
.loginPage("/login")
.defaultSuccessUrl("/admin/login123")
.permitAll() // 开启表单登录并配置登录接口
.and()
.authorizeRequests() // 开启 HttpSecurity 配置
.antMatchers("/admin/login","/login/doLogin")
.permitAll()
.antMatchers("/admin/**").hasRole("admin")// admin/**
.and().csrf().disable(); // 关闭csrf
}
按照我的想法和他的想法配置了loginProcessingUrl就应该在点击登陆按钮的是去请求我们自己写的/login/doLogin
这个接口,但是事实是没有。原因是什么呢,原因是security根本不会去请求我们自己写的/login/doLogin
这个接口,
loginProcessingUrl的作用是用来拦截前端页面对/login/doLogin
这个的请求的,拦截到了就走它自己的处理流程(例如这个UserDetailsService的loadUserByUsername这个方法
,UserDetailsService是security的提供的一个接口,一般我们开发的时候需要去实现这个接口),所有我们自己后端写的/login/doLogin
这个接口有写跟没写是一样的。所以我后来直接叫他不去设置loginProcessingUrl这个值了,然后前端登陆页面的form表单的action=""就行
至于后端接口怎么获取当前登陆的用户信息请看下面代码
//UserDetails是security提供的一个接口,一般实体类的用户需要去实现它,
UserDetails admin = (UserDetails)SecurityContextHolder.getContext().getAuthentication().getPrincipal();
//我朋友的实体类叫Admin,于是下面这一句也是可以的
Admin a = (Admin)admin;
实体类部分代码如下
public class Admin implements UserDetails {
private Integer admin_id/*管理员ID*/;
private String admin_name/*管理员登录名*/;
private String admin_nickname/*管理员昵称*/;
private String admin_password/*管理员密码*/;
//省略get/set方法
}