在没有使用springBoot之前,我们配置权限使用的是配置文件,在配置文件中做一些事情,比如哪些页面需要拦截或者不拦截,是否使用自定义页面,密码是否需要加密等等操作
在你使用了springBoot之后,还是要完成这些事情,只是使用配置类来完成这些事情。
我们需要认识一个注解:EnableWebSecurity,点击去看一下
我们发现,他导入了两个类,分别是WebSecurityConfiguration和SpringWebMvcImportSelector,我们探究一下WebSecurityConfiguration这个类是在干什么
我们点进去看一下
我们发现这个类当中有一个springSecurityFilterChain的bean,这个bean是SpringSecurity的核心过滤器,是请求的入口。
什么是认证的入口?
举个简单的例子,比如说你准备去坐长途汽车,你是不是要先去车站,车站就是认证的入口,你只有先到这个地方,我才能给你验证。
权限验证也是一样,你只有经过这个入口,才能去验证身份。
@Import的下面有@EnableGlobalAuthentication这个注解,我们继续点进去
发现他导入了这样一个类,那么,这个类又是在干嘛?这个类我们将它叫做全局认证机制配置,主要目的是配置一个认证管理器组件AuthenticationManager 这个管理器组件AuthenticationManager会在运行时用于认证请求者身份 也就是说,这里是身份认证的入口
什么是身份认证的入口?
相当于你到了车站不仅找到安检的地方,还找到了检验你身份的警察叔叔,这个管理器组件拿到你的请求者的信息决定是否放行
现在的问题是这个注解可以做两件事情,那我们要去具体做着两件事情
我们需要自己去写一个类,然后继承WebSecurityConfigurerAdapter这样一个适配器,重写三个configure方法编写需要的配置
public class SecurityConfiguration extends WebSecurityConfigurerAdapter { @Autowired private UserService userService; /** * AuthenticationManagerBuilder * 看名字就知道他是一个xxx的构建,是一个认证管理器的构建 * 我们只需要向这个类中配置用户信息,就能生成认证管理器,那么我们如何往这个类中添加用户信息呢 * 我们肯定是事先准备好一个封装好用户信息的类,将这个类直接扔到AuthenticationManagerBuilder中 * 我们在userService中如何封装用户信息呢 * 实现UserDetailsService接口,并重写loadUserByUsername方法,返回一个包含用户信息和权限信息的User * @param auth * @throws Exception */ //定义通过哪个service进行验证,要不要使用加密 @Override protected void configure(AuthenticationManagerBuilder auth) throws Exception { auth.userDetailsService(userService).passwordEncoder(new BCryptPasswordEncoder()); } /** * WebSecurity用来创建FilterChainProxy过滤器 * @param web * @throws Exception */ @Override public void configure(WebSecurity web) throws Exception { super.configure(web); } /** * 重写的configure方法中的HttpSecurity是一个重要参数,用于配置Security重要的拦截及权限控制 * @param http * @throws Exception */ //定义拦截规则 @Override protected void configure(HttpSecurity http) throws Exception { http.csrf().disable() /** * authorizeRequests()的使用 * //所有接口都不需要权限认证 * http.authorizeRequests().antMatchers("/**").permitAll(); * //所有接口都要进行权限认证 * http.authorizeRequests().antMatchers("/**").authenticated(); * //只有以test开头的接口需要进行权限认证 * http.authorizeRequests().antMatchers("/test/**").authenticated(); */ .authorizeRequests() //登录页面不拦截 .antMatchers("/emp/login").permitAll() //拦截所有页面,除了拥有角色EMP和ADMIN的不拦截 .antMatchers("/emp/*").hasAnyRole("EMP","ADMIN") .antMatchers("/admin/*").hasAnyRole("ADMIN") .anyRequest().permitAll() .and().anonymous() .and().formLogin() //.loginPage("/user/login.html") .and().httpBasic(); }
简单来说三个方法的作用是
1.如何去验证身份信息,需要你将userService,也就是你想要验证的方式扔到参数中
2.你想要过滤,是不是要先有一个过滤器,过滤器哪里来,第二个方法创建
3.你拦截的具体的规则
包括permitAll(),authenticated()等等一些方法
这些就是springBoot整合springSecurity。