SpringSecurity-用户认证基础之自定义用户名密码的三种方式及其优缺点对比


前言

作为本月最后一篇文章, 想写点Web技术相关的, 浏览了本月的博客发现居然全是数据结构与算法的文章🤪,说实话我是有点写吐了的. 十二月的话 , 计划是不会用新文章了(不过可能会更新数据结构和JavaSE的思维导图) . 毕竟考试月到了嘛,学校的课程除了数据结构几乎没怎么学过其它的.

行了行了,话不多说, 我们进入正题


提示:以下是本篇文章正文内容,下面案例可供参考

一、使用配置文件定义用户名密码

丑话说在前头, 用户名密码对于Web应用程序来说, 不应该是写死的东西. 所以用配置文件定义的话 , 是非常鸡肋的.

代码

我这里用的是properties的代码, 转为yml道理也一样

#通过配置文件配置用户名密码
spring.security.user.name= admin
spring.security.user.password=123

二、使用配置类

我们直接给代码,因为下面第三点用到的配置类功能更加强大, 这种方式的自定义并不常用

@Configuration
public class SecurityConfig extends WebSecurityConfigurerAdapter {
    @Override
    protected void configure(AuthenticationManagerBuilder auth) throws Exception {
        auth.inMemoryAuthentication().withUser("").password("").roles("");
    }

三、使用配置文件加实现类的方式

这种是比较常用且实用的方式,写起来也更加灵活

大体思路可以分成两步 ,创建配置类并对实现类进行一定的配置(主要是编码方式), 创建实现类查询出用户名密码并注入到框架提供的User对象之中

代码实现

1.配置类
我们首先需要去继承WebSecurityConfigurerAdapter类,同时向Spring注入UserDetailsService对象,并对父类的configure(AuthenticationManagerBuilder auth)方法进行重载

@Configuration
public class SecurityConfig extends WebSecurityConfigurerAdapter { //1.继承WebSecurityConfigurerAdapter类
    //2.注入userDetailsService对象
    @Autowired
    private UserDetailsService userDetailsService;//

    //3.重写configure对象
    @Override
    protected void configure(AuthenticationManagerBuilder auth) throws Exception {
        auth.userDetailsService(userDetailsService).passwordEncoder(password());
    }

    //4.设置密码编码方式
    @Bean
    PasswordEncoder password(){
        return new BCryptPasswordEncoder();
    }
}

2.实现类

这里需要注意得是,对于@Service中的参数 ,必须与前面配置类中注入的UserDetailsService对象完全一致

@Service("userDetailsService") //1.将用户信息服务类标记为userDetailService
public class MyUserServiceDetailService implements UserDetailsService { //2.实现UserDetailsService接口

    @Autowired
    AdminDao adminDao;

    @Override
    public UserDetails loadUserByUsername(String s) throws UsernameNotFoundException {
        //3.从数据库中查找用户的账号密码及权限信息
        List<Admin> adminInfo = adminDao.getAdminInfo();
        Integer adminPwd = adminInfo.get(0).getAdminPwd();
        String adminId = adminInfo.get(0).getAdminId();
        List<GrantedAuthority> auth = AuthorityUtils.commaSeparatedStringToAuthorityList("admin");
        //4.注入
        return new User(adminId , new BCryptPasswordEncoder().encode(adminPwd.toString()),auth);
    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值