解决spring security loginProcessingUrl无效问题
作者:客 卿
这篇文章主要介绍了解决spring security loginProcessingUrl无效问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
spring security loginProcessingUrl无效
近几天被一个朋友问道了一个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方法
}总结
以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。
