• Spring Security详解


    前面的加依赖、配置用户名密码啥的就略过了,大家随便百度谷歌都可以做出来,这边文章主要讲比较详细的原理;

    Spring Security无非就是登录授权!但是其实涉及的内容极多,包括各种防护手段啥的;

     Spring Security强制要密文存储的,所有定制了一个PasswordEncoder接口:

    publicinterface PasswordEncoder {
        String encode(CharSequence rawPassword);
        boolean matches(CharSequence rawPassword, String encodedPassword);
        default boolean upgradeEncoding(String encodedPassword) {
            returnfalse;
        }
    }

    这里的encode是明文加密之后返回的密文;

    matches就是把用户登录的明文密码和数据库中保存的密文密码做参数,返回一个boolean值判断能否登录;

    upgradeEncoding是指再次加密,这个一般不会用到;

    开始配置:

     这里重写的configure方法是有3个重载的,对应的参数分别是:

    AuthenticationManagerBuilder auth

    HttpSecurity http

    WebSecurity web

    auth这个是用来做用户、密码、权限操作;web是用来做忽视url,常用于一些静态文件;http是用来做页面访问,包括对于的访问路径是否需要验证,是否要添加一些自定义的过滤器,定义成功或失败的回调函数successHandler和failureHandler等等;

    在参数auth的这个重写方法configure需要配置对应的用户、密码以及权限,而这些是通过查询数据库找到的,所有一般会把这些信息封装为一个对象:UserDetails:

     这里面也定义了一些判断方法,认证的操作,框架都已经帮你实现了,它定义了一个UserDetailsService接口,你只需去实现就好,然后把UserDetails返回再把UserDetailsService注入到容器中就可以了;

     这里的AdminUserDetails是实现类UserDetails接口的类;

    最后在configure方法里配置好就可以:

     UsernamePasswordAuthenticationToken:这里是对UserDetails的再一次封装:

     这里的principal和credentials可以近似看作用户、密码;不过Objects类型,便于封装,就如此例的userDetails;

    再梳理一下整个登录认证过程:

    1、

     通过username查到封装了用户密码以及权限的对象,注意这个对象可以是自己自定义,且这里的loadUserByUsername方法调用的是自己配置好的:

     2、根据拿到的userDetails对象拿到数据库里的password和传入来的password做匹配,如果认证成功,则对UserDetails再一次封装后存入代表当前用户上下文的SecurityContext:

     如失败则返回提示;如要做jwt也是在这之后生成token并发给客户端;

    授权:

    之前的UsernamePasswordAuthenticationToken其实就已经把用户对应的权限以Collections形式封装进去了,如下图里对应的authoriities属性:

     

    之后在控制层通过注解的形式设置好访问路径所需要的权限:

  • 相关阅读:
    提出贷方,提出借方
    .Net反编译工具Reflector
    通过SQL Server的位运算功能巧妙解决多选查询
    使用.NET中的XML注释(一) XML注释标签讲解
    从网络中拷贝文件xcopy
    用netsh同步网络配置
    背书
    LINUX开启允许对外访问的网络端口的命令
    PHP在线生成二维码(google api)的代码
    linux常用disk磁盘操作命令(2013最新整理)
  • 原文地址:https://www.cnblogs.com/lzj-learn/p/14705893.html
Copyright © 2020-2023  润新知