SpringBoot整合SpringSecurity

在没有使用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。

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值