Spring Security极简入门三部曲(中篇)


目录
  • Spring Security极简入门三部曲(中篇)
    • 验证流程
    • Authentication接口
    • 过滤器链
    • AuthenticationProvider接口:
    • demo时刻
    • 代码讲解
    • 小结

Spring Security极简入门三部曲(中篇)

大家好,我是白泽。通过上篇的学习,我们实现了一个简单的基于角色验证的小demo,但是不足之处在于用户和角色的信息我们写死在了内存中,而实际项目中必然是写在数据库里的,但是在将数据存入数据库之前,为了让你更深入理解Spring Security授权的验证流程,我需要为你介绍一些关键的接口和类(很遗憾这一部分无法完全避免),如果你只想继续学习Spring Security的使用,直接跳到demo时刻部分吧!

验证流程

Authentication接口

用户在前端输入的登陆信息传入后台后将封装入一个Authentication接口的实现类,它作为认证和授权的对象穿过整个过滤器链,反过来我们也能从Authentication实现类中取出用户账户的相关信息(用户名、密码、获取的权限等) Authentication实现类的获取方法:SecurityContextHolder.getContext().getAuthentication()

public interface Authentication extends Principal, Serializable {
    Collection<? extends GrantedAuthority> getAuthorities();//返回一组已经分发的权限(角色)

    Object getCredentials();	//返回凭证,即密码

    Object getDetails();		

    Object getPrincipal();		//返回身份信息,即用户名

    boolean isAuthenticated();

    void setAuthenticated(boolean var1) throws IllegalArgumentException;
}

过滤器链

Spring Security框架核心有一个ProviderManager类,点开它的源码,它有一个Listgithub项目地址

  • 自定义一个验证器加入过滤器链(实现:当用户使用baize账户登陆时,无论密码是什么,都将获取USER和ADMIN权限)

  • 代码讲解

    事实上我们只新建了AuthenticationProvider接口的实现类BaiZeAuthenticationProvider,去重写它的两个方法,自定义了一个验证器。并在SecurityConfiguration类中完成注入(相当于自定义过滤器加入过滤器链)

    @Override
        public Authentication authenticate(Authentication authentication) throws AuthenticationException {
            //从authentication实例中获取用户名和密码(这个authentication实例贯穿流程始终)
            String username = authentication.getName();
            String password = authentication.getCredentials().toString();
            if (username.equals("baize")) {
                Collection authorities = new ArrayList<>();
                authorities.add(new SimpleGrantedAuthority("ROLE_ADMIN"));  //ROLE_ADMIN写法是固定的
                authorities.add(new SimpleGrantedAuthority("ROLE_USER"));   //ROLE_USER写法是固定的
                return new UsernamePasswordAuthenticationToken(username, password, authorities);
            } else {
                return null;
            }
        }
    

    小结

    1. 很抱歉我依旧没有为你讲解如何将用户、角色等数据存入数据库中,本节更多是介绍了Spring Security的验证流程,但相信你如果真的结合demo2学了下来,你的收获一定不小
    2. 我们自定义了一个验证器并将其加入过滤器链使黑客baize账户获取两个权限并完成登陆
    3. 白泽将在下一篇真正开始将数据存入数据库并构成第三个demo,敬请期待吧~
    4. 欢迎评论区留言