springsecurity认证和授权

  • 认识springsecurity自带的认证过滤器


认识springsecurity自带的认证过滤器

认证的步骤

一,springsecurity的过滤器是在servlet中写的一个过滤器,是对servlet的Filter类的改造,如下图所示

springsecurity中session为何每次登录之后前一个sessionid就失效了_前端


springsecurity的过滤器将所有的servlet路径都放入了过滤器当中。

二、springsecurity写了一个自己的过滤器,并且定义了一个登入的请求路径,UsernamePasswordAuthenticationFilter,接口是/login,如下图所示

springsecurity中session为何每次登录之后前一个sessionid就失效了_ide_02


三、在UsernamePasswordAuthenticationFilter类的attemptAuthentication方法里面,主要是获取到前端的登入账号和密码,并存入到UsernamePasswordAuthenticationToken类当中,这个类集成了Authentication接口,此类的底层用的是ThreadLoad,所以不用担心在同一个线程下拿不到UsernamePasswordAuthenticationToken里面的值。

四、重写UserDetailsService,重写这个类的目的有很多,1.获取用户账号和密码交给springsecurity去错密码账号的校验,2.拿到当前用户的权限和角色等,下面这个图是springsecurity对用户的密码和账号的校验,这里需要主要到AbstractUserDetailsAuthenticationProvider类和DaoAuthenticationProvider类,在springsecurity当中,以provider结尾的类,基本上就是用来处理用户是否有资格登入系统、返回用户的信息的类。

springsecurity中session为何每次登录之后前一个sessionid就失效了_前端_03


五、AbstractUserDetailsAuthenticationProvider类,这个类主要是用来处理用户的登入资格和返回用户信息的类,只要这个类运行完成之后,并且没有报错和被拦截,那基本上是登入成功到系统了。

六、重写AuthenticationSuccessHandler和AuthenticationFailureHandler,这两个类很重要,如果你用的是session,你需要在这里使用session存放用户的信息、角色和权限资源等,如果你使用的是token,你需要在这里生成token并存放到持久层中。

七、springsecurity是基于Servlet框架做的授权和认证的,在登录成功之后,springsecurity默认使用的是session做存放用户信息的,所以,在返回登入成功信息之前,springsecurity还会生成sessionId,并且把sessionId存放到cookies当中,登入成功之后,返回了一大堆用户信息以及cookies当中的sessionId,在进入系统后,每一次的请求,前端都会携带sessionId进入后端,springsecurity会帮你拿到sessionId去做再次认证,不过以及不需要再去走UsernamePasswordAuthenticationFilter这个过滤器了,而是走BasicAuthenticationFilter过滤器(这个类我没有重写过,但看了源码和找了一些资料后的推断),如果想要使用token,则需要重写BasicAuthenticationFilter此过滤器

自此,认证的所有流程就已经走完,这个是springsecurity自带的过滤器,我们也可以写自己的过滤器去做单点登入,一般用于别的系统登入我们自己的系统

springsecurity中session为何每次登录之后前一个sessionid就失效了_ide_04


springsecurity中session为何每次登录之后前一个sessionid就失效了_servlet_05