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属性:

 

 

 

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

 

posted @ 2021-04-27 15:08  xiao兆  阅读(2345)  评论(0编辑  收藏  举报