(Spring Security)学习六:自定义用户(如:数据库用户)登录

引言

之前有篇文章《(Spring Security)实战干货一,自定义权鉴的实现》中以及基本描述了该项实现,能够从数据库中获取用户信息,并进行认证。
实现UserDetailsService接口重写loadUserByUsername方法,这个方法是实现自定义用户登录的关键,这个方法中实现查询数据库用户信息,并判定用户存在性,同时还有实现PasswordEncoder接口,来匹配登录密码与数据库密码的关系。

OursUserDetailsService

自定义UserDetailsService接口的实现类OursUserDetailsService
实现用户数据及用户权限资源获取。(后期会深入探讨,用户认证生成的User)

/**
 * 服务器:自定义,用户认证服务
 */
@Component("oursUserDetailsService")
public class OursUserDetailsService implements UserDetailsService {
    @Autowired
    private IUsersService usersService;

    /**
     * Security权限管理用户数据库方法
     *
     * @param username
     * @return
     * @throws UsernameNotFoundException
     */
    @Override
    public UserDetails loadUserByUsername(String username) throws UsernameNotFoundException {
        System.out.println("用户详情5.1");
        //查询用户
        Users users = usersService.findByUsername(username);
        if (users == null) {
            throw new UsernameNotFoundException("用户不存在");
        }
        
        //获取用户资源
        List<String> roles = usersService.findRolesCodeByUserId(users.getId());
        List<String> rules = usersService.findRuleNameByUserId(users.getId());
        List<String> authorities = new ArrayList<>();
        if (users.getId() == 1) {
            authorities.add("ROLE_ADMIN");
        } else {
            roles = roles.stream()
                    .map(rc -> "ROLE_" + rc)
                    .collect(Collectors.toList());
            authorities.addAll(roles);
            authorities.addAll(rules);
        }
        User user = new User(users.getUsername(), users.getPassword(), AuthorityUtils.commaSeparatedStringToAuthorityList(String.join(",", authorities)));
        return user;
    }
}

其中关于用户信息获取的Service就不赘述了。

OursPasswordEncoder

自定义PasswordEncoder接口的实现类OursPasswordEncoder
主要是将登入表单的password通过OursPasswordEncoder进行同数据库中加密(encode)过的password进行比对处理matches方法,来判断密码有效性。

/**
 * 编码器:自定义密码验证编码器
 */
@Component("oursPasswordEncoder")
public class OursPasswordEncoder implements PasswordEncoder {
    /*public OursPasswordEncoder(){
        System.out.println("密码编码器4:OursPasswordEncoder");
    }*/
    /**
     * 加密
     *
     * @param charSequence
     * @return
     */
    @Override
    public String encode(CharSequence charSequence) {
        //System.out.println("密码编码器4.1");
        //自定义盐
        String authCode = null;
        String AUTHCODE = "盐";//
        if (!(authCode != null && authCode.length() != 0)) {
            authCode = AUTHCODE;
        }
        //加密方式 简单MD5加密,可以用securit自带加密方式,更安全,此处是演示使用,自定义自己的加密方式
        String password = (String) charSequence;
        password = authCode + password;
        password = DigestUtils.md5DigestAsHex(password.getBytes());
        return password;
    }

    /**
     * 加密对比
     *
     * @param charSequence
     * @param s
     * @return
     */
    @Override
    public boolean matches(CharSequence charSequence, String s) {
        //System.out.println("密码编码器4.2");
        //加密部分
        String password = encode(charSequence);
        //--
        return s.equals(password);
    }
}


配置

    @Override
    protected void configure(AuthenticationManagerBuilder auth) throws Exception {
        auth.userDetailsService(oursUserDetailsService).passwordEncoder(oursPasswordEncoder);
    }

注意,application.yml中的

spring:
 security:
  user:
   name: abc
   password: 123

可以删除掉了。

启动运行,发现可以通过数据库中的用户来登录了!结束!

  • 3
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

希克

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值