spring security 是一个能够为 基于Spring的 企业应用系统提供声名式安全控制访问的安全框架,它利用了Spring的容器,充分利用了Spring的ioc和id,使我们不用再为了安全控制编写大量的代码
Spring security的使用必须基于Spring的监听器,监听器去加载security的配置文件 (不能使用springMvc的Servlet去读取配置文件,因为Servlet创建的容器是子容器,他的父容器是监听器创建的容器,所有子容器可以共享父容器的bean,但是父容器不能拿到子容器里面的bean),
读取要放行的路径,以及其他的一些配置,比如是否使用表达式,拦截路径,认证成功后的跳转路径,用不用csrf令牌校验,配置框架页面不拦截等
最重要的是配置认证管理器,认证管理器内配置认证提供者, 提供者可以用自己默认写死的用户名和密码,这样在访问服务器的时候,请求被security的过滤器拦截,获取到用户名和密码,调用认证管理器进行比较,然后放行或拦截,但一般我们不用这种方式,一般测试时候用
实际开发中需要用到用户存在数据库的用户名和密码,这时需要自定义认证提供者,定义一个类,实现UserDetailsService接口,重写
publicUserDetails loadUserByUsername(String username) 方法,在这个方法里去掉用能获取数据库数据的服务:
1,如果所有服务都在一个服务器上,自定义认证管理器直接注入dao,调用方法,获取用户数据
2,如果是分布式服务,自定义认证提供者需要声明一个服务属性 ,然后生成set方法,在配置文件里配置bean时,声明这个property,
但是这个property引用的服务还需要从注册中心过去,所以还需要注册中心的配置,如果数据库的密码是加密的,需要在配置认证管理器中的认证提供者时候,声明所使用的加密器,
认证流程: 用户发送请求---> 过滤器拦截,获取用户名和密码,交给认证管理器,--> 认证管理器调用认证提供者中的方法--->此方法调用注入的服务,去,数据库获取用户信息,返回一个UserDetails的实现类user对象,此对象中已包含用户名密码权限-->,把此对象返回给认证管理器,管理器把前台传来的密码用同样的方法加密后,和数据库中的密码对比-->然后根据是否匹配,进行相应的跳转;
领取专属 10元无门槛券
私享最新 技术干货