java

关注公众号 jb51net

关闭
首页 > 软件编程 > java > spring security loginProcessingUrl无效

解决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这个的请求的,拦截到了就走它自己的处理流程(例如这个UserDetailsServiceloadUserByUsername这个方法,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方法
}

总结

以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。

您可能感兴趣的文章:
阅读全文