SpringSecurity登录遇到的空指针和403问题
首先
在SecurityConfig配置类中已经放行。
并且要关闭 csrf
http
//关闭csrf
.csrf().disable()
//不通过Session获取SecurityContext
.sessionManagement().sessionCreationPolicy(SessionCreationPolicy.STATELESS)
.and()
.authorizeRequests()
// 对于登录接口 允许匿名访问
.antMatchers("/login").anonymous()
.antMatchers("/updatePsd").anonymous()
// swagger3放行
.antMatchers("/webjars/**").permitAll()
.antMatchers("/swagger-resources/**").permitAll()
.antMatchers("/v2/**").permitAll()
.antMatchers("/swagger-ui/**").permitAll()
.antMatchers("/swagger-ui/index.html").permitAll()
.antMatchers("/v3/api-docs").permitAll()
// 除上面外的所有请求全部需要鉴权认证
.anyRequest().authenticated();
但是在loadUserByUsername方法中得不到name的值。经过debug发现
得不到name的值,最后将数据库的值全部删除,然后用passwordEncoder重新生成密钥。再登录发现name的值可以得到了。
然后
虽然name有值了,但是依然报403错误。
最后发现是service中login方法中的问题:
public Map<String,Object> login(User user) {
//1.通过用户名查询用户信息
QueryWrapper<User> waper = new QueryWrapper<User>()
.eq("name",user.getName());
User userInfo = userMapper.selectOne(waper);
//2.判断用户名密码是否匹配
UsernamePasswordAuthenticationToken authenticationToken = new UsernamePasswordAuthenticationToken(userInfo .getName(),userInfo .getPassword());
Authentication authenticate = authenticationManager.authenticate(authenticationToken);
在new UsernamePasswordAuthenticationToken传参数时,用的是查询得到的 userInfo 而不是 请求发送的 user对象。所以一直报403。
userInfo中的pasword是密文的。