zoukankan      html  css  js  c++  java
  • Spring Security构建Rest服务-0600-SpringSecurity基本原理

    一、引入

    只要引入了spring-boot-starter-security,所有的服务都会被保护起来。启动项目,打开时所有的controller会被保护起来,随便访问一个,如http://localhost:8080/user就是这个效果,让我们输入用户名密码,默认的用户名是user,密码会在应用启动时在控制台打印:Using default security password: 1e520d65-b38b-4522-a340-fbe2612821fc

    然后才能正常访问接口:

    在application.properties里可以关闭这个默认值:security.basic.enabled = false,就不会有登录认证了。

    表单登录

    受保护的接口,需要登录才能访问的,一般都是跳转到登录页,springboot默认那个弹框原来是http basic认证(网上找的以前我还真不知道这个):

    在HTTP协议进行通信的过程中,HTTP协议定义了基本认证过程以允许HTTP服务器对WEB浏览器进行用户身份证的方法,当一个客户端向HTTP服务器进行数据请求时,如果客户端未被认证,则HTTP服务器将通过基本认证过程对客户端的用户名及密码进行验证,以决定用户是否合法。客户端在接收到HTTP服务器的身份认证要求后,会提示用户输入用户名及密码,然后将用户名及密码以BASE64加密,加密后的密文将附加于请求信息中,如当用户名为anjuta,密码为:123456时,客户端将用户名和密码用“:”合并,并将合并后的字符串用BASE64加密为密文,并于每次请求数据时,将密文附加于请求头(Request Header)中。HTTP服务器在每次收到请求包后,根据协议取得客户端附加的用户信息(BASE64加密的用户名和密码),解开请求包,对用户名及密码进行验证,如果用户名及密码正确,则根据客户端请求,返回客户端所需要的数据;否则,返回错误代码或重新要求客户端提供用户名及密码。

    下边就来让springboot去做表单登录这件事:

    在browser项目新建一个配置类:

    package com.imooc.security.browser;
    
    import org.springframework.context.annotation.Configuration;
    import org.springframework.security.config.annotation.web.builders.HttpSecurity;
    import org.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter;
    
    @Configuration //这是一个配置
    public class BrowserSecurityConfig extends WebSecurityConfigurerAdapter{
    
        @Override
        protected void configure(HttpSecurity http) throws Exception {
            //实现需要认证的接口跳转表单登录,安全=认证+授权
            //http.httpBasic() //这个就是默认的弹框认证
            http.formLogin() //表单认证 
                .and()
                .authorizeRequests() //下边的都是授权的配置
                .anyRequest()        //任何请求
                .authenticated();    //都需要身份认证
        }
    }

    这样springboot就会跳转到默认的登录页面了:

    springboot做了一个跳转,再跳到/user:

     二、SpringSecurity基本原理

    SpringSecurity就是一组过滤器,是一个过滤器链。应用启动的时候SpringBoot会自动给配置进去,所有请求和响应都会经过过滤器链。

    绿色的一系列过滤器:可配置,作用就是认证用户的身份,检查当前的请求里是否有过滤器所需要的信息。

          如UsernamePasswordAuthenticationFilter:处理表单登录,会检查请求是否是登录请求,有的话是否带用户名密码,有的话就用用户名密码做登录,否则就放过,执行下一个过滤器,如http basic过滤器。

          BasicAuthenticationFilter处理http basic登录。

    FilterSecurityInterceptor:不可配置,过滤器最后的守门员, 到达controller之前,会经过这个过滤器。他决定是否能访问Controller,依据就是上边BrowserSecurityConfig 配置类里的配置(这个配置可以按需配置,如可以配置权限VIP用户才能访问等)飘红部分是说所有的请求都需要经过认真才能访问,所以FilterSecurityInterceptor就判断请求是否已经经过了一个过滤器的认证。判断的结果就是过或者不过,过的话就能访问controller了,不过的话就会根据不能访问的原因抛出相应的异常,如没有经过身份认证就抛出没身份认证异常,如通过了身份认证没有经过权限认证就抛出没有权限异常等。

    ExceptionTranslationFilter:不可配置,处理FilterSecurityInterceptor抛出的异常,根据不同的异常进行相应处理。如未登录抛的异常,就跳到登录页或进行httpbasic弹框认证。

    SpringSecurity提供的所有的功能特性都是建立在这个过滤器链基础上的,手机验证码登录、qq、微信登录都是在这个绿色的过滤器链上加过滤器。

  • 相关阅读:
    javascript简繁转换函数
    在嵌套的repeater中加ItemDataBound事件
    asp.net url重写方法和步骤
    打开,另存为,属性,打印"等14个JS代码
    php中global的用法
    ini_get
    PHP学习笔记
    PHP isset()与empty()的使用区别详解
    PHP符号说明
    html禁止清除input文本输入缓存
  • 原文地址:https://www.cnblogs.com/lihaoyang/p/8481821.html
Copyright © 2011-2022 走看看