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属性:
之后在控制层通过注解的形式设置好访问路径所需要的权限: