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

发布于:2023-01-04 ⋅ 阅读:(333) ⋅ 点赞:(0)

引言

之前有篇文章《(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

可以删除掉了。

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


网站公告

今日签到

点亮在社区的每一天
去签到