zoukankan      html  css  js  c++  java
  • 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属性:

     

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

  • 相关阅读:
    JMX堆栈分析
    Python装饰器示例
    安装指定版本capistrano
    Linux CPU使用率含义及原理
    API gateway 之 kong 安装
    Redis内存分析方法
    Elasticsearch集群内的原理
    Elasticsearch基础
    Python智能检测编码并转码
    (转)rabbitmq的web管理界面无法使用guest用户登录
  • 原文地址:https://www.cnblogs.com/lzj-learn/p/14705893.html
Copyright © 2011-2022 走看看