Spring Boot框架、Spring Security框架

一、Spring Boot框架

1.1 Spring Boot框架的作用

        Spring Boot框架主要解决了:依赖管理

        Spring Boot被设计为“开箱即用”的,它是一种“约定大于配置”的思想。

1.2 依赖管理

        在开发实践中,需要使用到的依赖项很多,而且,添加的某个依赖项可能还依赖了其他依赖项,例如,当添加spring-webmvc时,spring-webmvc还依赖了spring-context,另外,在添加spring-jdbc时,spring-jdbc也会依赖spring-context,如果spring-webmvc和spring-jdbc依赖的spring-context的版本并不相同,则项目是不可用的。

所以,众多的依赖项必须是协调的,版本应该兼容且不冲突,Spring Boot项目,都使用了spring-boot-starter-parent作为父级项目,这个父级项目就管理了许多依赖项的版本,所以,在pom.xml中添加依赖时,某些依赖项是不需要写版本号的,并且,它提供大量的spring-boot-starter-???的依赖项,例如spring-boot-starter-web,这些依赖项会将相关的一组依赖整合在一起,开发者添加依赖时更加方便!

1.3 自动配置

在spring-boot-starter依赖项中包含了spring-boot-autoconfigure,这个spring-boot-autoconfigure就是实现自动配置的,其中包含了大量的、预编写的自动配置类,这些自动配置类中使用了@ConditionalOnXxx系列的注解,对当前项目的环境(是否添加了那些依赖,是否创建了哪些对象。是否配置了那些属性)进行判断,已决定是否需要启用某些自动配置

另外,其实需要通过@EnableAutoConfiguration注解来开启自动配置,次注解已经被包含在@SpringBootApplication中了,所以,并需要显示的使用次注解

1.4相关注解

● @SpromhBootApplication:添加在启动类上,每个Spring Boot项目只能有一个类添加此注解

● @SpringBootConfiguration:包含@Configuration,被包含在SpringBootApplication中

●@SpringBootTest:标记某个类是基于Spring Boot的测试类,执行这个类中的测试方法时,回家再Spring Boot的所有环境,包括执行组件扫描,读取配置文件

二 、Spring Security框架

2.1 Spring Security框架的作用

Spring Security框架主要解决了认证与授权的相关问题。

2.2 相关概念

认证:识别客户端的身份,Spring Security只会根据SecurityContext中的认证信息(Authentication对象)来识别客户端的身份

授权:控制客户端是否允许访问某个资源

提示:登录是处理认证时非常重要且不可或缺的一个环节,在处理登录时,需要将通过登录验证后的结果(认证信息)存入到SecurityContext中,后续,Spring Security会从SecurityContext中找到认证信息,从而识别客户端的身份

2.3Spring Security框架的基本特点

在Spring Boot项目中,当添加了spring-boot-starter-securiry依赖后,你的项目会发生以下变化:

        ● 所有请求都是必须通过认证的,否则,会相应403,或重定向到默认的登录页面

        ● 提供了默认的登录页(/login)和登出页(/logout)

        ● 提供了默认的登录账号,用户名为user,密码为启动项目时的控制台提示的UUID值

        ● 默认开启了防止伪造的跨域攻击和防御机制,自定义的POST请求无法正常处理

2.4 关于Spring Security的配置类

在项目中,可以自定义类,继承自WebSecurityConfigurerAdapter,则此类是Spring Security的配置类,在类中重写void configurer(HttpSecurity http)方法进行配置

@Configuration
public class SecurityConfiguration extends WebSecurityConfigurerAdapter{
    public void configurer(HttpSecurity Http){
        //配置请求的授权访问 注意:要使用第一匹配原则
        http.authorizeRequests()
            .mvcMatchers(“/user/login”)//匹配若干个路径,可以使用Ant-style通配模式
            .permitAll()//允许直接访问,不需要检查认证信息
            .anyRequest()//所有请求,也可以视为除了以上配置过的以外的其他请求
            .authenticated();//要求是已经通过认证的,侧需要检查认证信息
        
        //如果调用以下方法,将启用默认的登录页和登出页,当时为未通过认证时,将重定向到登录页
        //如果不调用以下方法,将不启用默认登录页和登出页,当视为未通过认证时,将响应403
        //还可以在以下方法的基础上,进一步调用其他方法对登录页和登出页进行配置
        http.formLogin();
        

        //禁用【防止伪造的跨域攻击的防御机制】,则自定义的POST请求可以正常处理
        http.csrf().disable();
    }
}

关于Ant-Style:

        当时用*通配符时,例如:/user/*,可以匹配/login,但不可以匹配/user/9527/delete 

        当时用**通配符时,例如:/user/*,可以匹配/login,也可以匹配/user/9527/delete 

关于第一批配原则:

        如果某个请求匹配以上配置的多种规则,将以第一次匹配到的为准,根据以上演示代码,/user/login匹配到了mvcMatcher()方法配置的路径,也匹配了anyRequest(),由于mvcMatcher()的代码靠前,则/user/login请求适用于permitAll(),而不会是authenticated(),在实际应用中,可以简单的认为:需要将精准的配置写在靠前的位置,需要将模糊的配置写在靠后的位置

4.5 使用Spring Security验证登录

Spring Security提供了UserDetailsService接口,接口中定义了UserDetails

loadUserByUsername(String username)方法,在登录验证时,Spring Security框架会自动使用登录时提交的用户名来调用这个方法,则框架将得到返回的UserDetails类型的对象,自动检查UserDetails对象中的用户状态,如果用户状态为不可用(被禁用、已过期),则抛出异常,然后还会自动验证登陆时提交的密码与UserDetails对象中的密码是否匹配,如果不匹配,则抛出异常,如果匹配则验证完成,将返回Authentication类型的结果

假设提交了登录信息:root /123456

【以下是框架自动执行】
UserDetails userDetails = userDetailsService.loadUserByUsername(“root”);
检查userDetails对象中包含的用户状态,例如是否禁用、是否过期等
检查userDetails对象中包含的密码,与123456是否匹配

        

 当需要自定义登录验证时,需要:

        ● 在配置类中,使用@Bean方法配置密码编码器(PasswordEncoder)

                Spring Security在验证密码是否匹配时,要求UserDetails类型的对象中的密码是某种密文格式

                一般定义在Spring Security的配置类中

        ●   在Spring Security配置类中,通过重新AuthenticationManager authenticationManagerBean()方法,并在方法上添加@Bean注解,则后续可以自动装配AuthenticationManager对象来制定登录验证

                 不建议重新AuthenticationManager()方法,在方法执行某些测试时会出现死循环,从而导致内存溢出

        ● 自定义组件类,实现UserDetailsService接口,并重写loadUserByUsername()方法

                一旦Spring容器中存在的UserDetailsService类型的对象,则Spring Security不在启用默认的登录账号,启动项目时控制台也不再显示临时的UUID密码

        ● 在需要执行登录验证的类中,先自动装配AuthenticationManager,然后在调用此对象的authenticate()方法即可执行登录验证

                提示:验证通过后,应该将authenticate()方法返回的结果存入到SecurityContext中,以保证后续能够通过认证

三、算法相关

3.1 关于UUID

        UUID是全球唯一码,他保证了在同一时空中的值是唯一的!

        UUID的算法并不是固定的,各个平台生成的UUID的特征并不相同

        UUID的主要特点:唯一、随机(不可预测)

        UUID本质上是由128位算法(运算结果是128个二进制位)运算得到的结果,在显示时,通常会转换为十六进制数,长度为32,并且,会在其中添加四个减号(经典格式是8-4-4-4-12),则总长度为36。

        另外,128位算法的结果有2的128次方个


3.2 关于BCrypt算法

注意:所有用于处理密码加密并最终保存到数据库中所使用的算法,都不是加密算法!所有的加密算法都是可以被逆向运算的,加密算法适用于保证传输过程的安全性的!用于处理密码加密并存储的算法,都是单向算法,即使算法、加密参数、密文均被泄露,也不可能通过运算还原出原始的密码(密码的原文)。

早起,典型的用于处理密码加密算法主要有:MD5、SHA-1等,这些算法是可以被穷举手段破解的!

BCrypt算法默认使用了随机的盐值,并且,此盐值被保存到觅稳重,作为密文的一部分,以便于后续验证密码。

BCrypt算法最大的特点就是“慢”!,他被故意设计为一种慢速算法,可以有效地防止暴力破解(循环尝试)。

BCrypt的算法的工具类是BCryptPasswordEncoder,这个类的构造方法可以传入参数,表示算法的强度值,默认为10,表示将进行2的10次方这么多次数的哈希运算,如果你认为现在执行BCrypt太快而不安全,可以适当的调整这个值,值越大,执行哈希运算的次数就越多,整体运算速度就会越慢

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值