前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >spring-security遇到的问题

spring-security遇到的问题

作者头像
roydonGuo
发布2022-11-02 15:55:10
4300
发布2022-11-02 15:55:10
举报
文章被收录于专栏:postsposts

记一次spring+mp+redis项目整合security时遇到的离谱问题。 原先刚开始学习security权限框架,自以为学的还不错,就纯手打把seacurity整合进了自己项目,但是,自从配置security配置后,就开始了一路debug。。。

先是csrf没有关,然后又是UserDetails的自定义实现类封装不进去。 然后又是Encoded password does not look like BCrypt。 然后又是一直403 forbidden。。

1.security配置

然后我又把security和redis单拉出来重新写了个demo,来回排查终于搞定了。 下面是这个小demo的config代码

代码语言:javascript
复制
/**
 * Created by Intellij IDEA
 * Author: yi cheng
 * Date: 2022/10/7
 * Time: 15:47
 **/
@Configuration
public class SecurityConfig extends WebSecurityConfigurerAdapter {

    @Bean
    public PasswordEncoder passwordEncoder() {

        return new BCryptPasswordEncoder();
    }

//    @Resource
//    private JwtAuthenticationTokenFilter jwtAuthenticationTokenFilter;

    @Override
    protected void configure(HttpSecurity http) throws Exception {
        http
                .cors()
                .and()
                //关闭csrf
                .csrf().disable()
                //不通过Session获取SecurityContext
                .sessionManagement().sessionCreationPolicy(SessionCreationPolicy.STATELESS)
                .and()
                .authorizeRequests()
                // 对于登录接口 允许匿名访问 anonymous
                .antMatchers("/user/login").anonymous()
                .anyRequest().authenticated();

        //把token校验过滤器添加到过滤器链中
//        http.addFilterBefore(jwtAuthenticationTokenFilter, UsernamePasswordAuthenticationFilter.class);


    }

    /**
     * AuthenticationManager注册进容器
     *
     * @return
     * @throws Exception
     */
    @Bean
    @Override
    public AuthenticationManager authenticationManagerBean() throws Exception {
        return super.authenticationManagerBean();
    }

}

这里controller只定义了一个用户登录接口,所以放行login就行了。然后就是关闭csrf不用多说。

2.UserDetailsService的loadUserByUsername()返回值封装

封装UserDetails的自定义实现类LoginUser实现UserDetails,就是用户认证实体类 里面方法返回true或get方法返回username和password就行。

3.Encoded password does not look like BCrypt

这个错误具体原因是数据库加密后的密码加密方式与传入的匹配不了。 可以使用spring容器中注入的密码加密bean重新生成加密密码存入数据库。 上面config里已经把BCryptPasswordEncoder注入到了spring容器,所以在test里调用一下即可。我这里是粗心又new 了一个BCryptPasswordEncoder进行的密码加密当测试用的,没想到挂在了这一步。 然后执行UserDetailsService中的方法会认证不通过,导致无法封装LoginUser返回对象,这样你的login方法的authenticationManager也就拿不到LoginUser这个对象,而只是把用户名封装了进去,连user对象都不是,所以后续一系列什么判断,new Authentication,存到redis类的都不会执行下去,控制台也不报错,中给个下面图片Encoded password does not look like BCrypt提示,肉眼很难发现,所以加密一定用bean中的bcrypt。

这个错不好发现,我的sql打印很多,要不是debug’实在没头绪我很难发现这有个错。

在这里插入图片描述
在这里插入图片描述
代码语言:javascript
复制
@Resource
private PasswordEncoder passwordEncoder;//容器中的 BCrypt
@Test
void pwdTest() {
//  BCryptPasswordEncoder passwordEncoder = new BCryptPasswordEncoder();不要自己new
    String pwd = passwordEncoder.encode("123456");
    System.out.println(pwd1);
}

此方法就能解决上图报错 password does not look like BCrypt 或者postman一直403 forbidden

demo的github地址github

本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2022-10-09,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 1.security配置
  • 2.UserDetailsService的loadUserByUsername()返回值封装
  • 3.Encoded password does not look like BCrypt
相关产品与服务
云数据库 Redis
腾讯云数据库 Redis(TencentDB for Redis)是腾讯云打造的兼容 Redis 协议的缓存和存储服务。丰富的数据结构能帮助您完成不同类型的业务场景开发。支持主从热备,提供自动容灾切换、数据备份、故障迁移、实例监控、在线扩容、数据回档等全套的数据库服务。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档