Spring Security---简介及初体验

Spring Security介绍

Spring框架带给了Java春天,但随着Java逐渐再次火了起来,出来了许多优秀的权限管理框架。Shiro和Spring Security无疑是让开发者争议较大的两个框架。

对于Shiro,轻量、易于集成、简单易上手等无疑是它最大的优势。

难道Shiro就没有缺点了吗?当然有,比如对于OAuth2支持不够,同时在Spring生态大火的前提下,Spring Security作为家族中的一员,明显占据着绝对的优势。

简单的说一下Spring Security的老事情。早起有一款框架叫Acegi Security,这款框架基于Spring,可以提供丰富的角色和权限管理。但是由于配置过于复杂,让有些开发者望而却步。后来Acegi Security改名Spring Security,加入了Spring家族的怀抱,配置也简化了许多。但是大家都知道,人嘛,不能比,框架亦是如此,正是因为有Shiro的存在,在配置方面,人们仍认为Shiro是重量级的存在。就在那电光火石之间,Spring Boot横空出世。古人云:”一人得道,鸡犬升天“,Spring Security也因此拔然而起。

核心功能

  • 认证:看看你的账号密码对不对
  • 授权:看看你具有哪些权限

其实不管是Shiro还是Spring Security,或者还是其他框架,最核心的功能就是认证和授权。

Security初体验

  1. 首先创建一个Spring Boot项目,引入Spring Security (不要忘记引入Spring Web)
    在这里插入图片描述

  2. 编写HelloController

@RestController
public class HelloController {
    
    

    @GetMapping("/hello")
    public String hello(){
    
    
        return "hello";
    }
}
  1. 直接启动Spring Boot,访问http://localhost:8080/hello,这个时候会跳转到login页面。此时url也重定向到了http://localhost:8080/login
    在这里插入图片描述

  2. 用户名默认为user,密码的话我们可以去启动日志里查看,Using generated security password后面的c426ead4-1fc2-4fd8-aea4-04ff4af6fc39就是生成的密码。
    在这里插入图片描述
    用户的密码是可以在配置文件中定义默认的密码,但是为什么会生成随机密码呢?在生成密码前可以看到一个类UserDetailsServiceAutoConfiguration(红框上面),这个是Spring Security自动配置类。
    在这里插入图片描述
    当isPasswordGenerated()为true时,就会在日志中输出生成的密码。而此时的User是存在于SecurityProperties.User类中,点进去的会发现默认的用户名是user,密码是默认通过UUID生成的,passwordGenerated 也默认为 true。好家伙,这给安排的明明白白的。
    在这里插入图片描述

默认密码配置

  • 配置文件配置

三位大佬已经帮我们定义好了前缀spring.security
在这里插入图片描述
只需要在application.properties配置一下就行了

spring.security.user.name=jerry
spring.security.user.password=javayyds

在SecurityProperties.User类中,properties中配置的name和password通过set方法注入了,同时还把passwordGenerated 属性设为false。
在这里插入图片描述

  • 配置类配置
@Configuration
public class SecurityConfig extends WebSecurityConfigurerAdapter {
    
    

    @Bean
    PasswordEncoder passwordEncoder() {
    
    
        //密码加密方案
        return NoOpPasswordEncoder.getInstance();
    }

    /*
     * withUser(用户名)
     * password(密码)
     * roles(用户角色)
     * and() 多角色设置分割
     */
    @Override
    protected void configure(AuthenticationManagerBuilder auth) throws Exception {
    
    
        auth.inMemoryAuthentication()
                .withUser("jerry")
                .password("javayyds").roles("admin")
                .and()
                .withUser("tom")
                .password("cppyyds").roles("user");
    }
}

创建SecurityConfig 配置类继承WebSecurityConfigurerAdapter ,提供一个PasswordEncoder 加密实例,通过@Bean注入。然后重写configure方法,通过 inMemoryAuthentication 来开启在内存中配置user、password和roles。当需要配置多个用户时,需要使用and()。

早期是在XML文件中通过标签来配置,标签有开始就有结束,and 符号相当于就是 XML 标签的结束符,表示结束当前标签,这个时候上下文会回到 inMemoryAuthentication 方法中,然后开启新用户的配置。

猜你喜欢

转载自blog.csdn.net/MAKEJAVAMAN/article/details/120961194
今日推荐