解决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方法 }
总结
以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。