SpringSecurity

发布时间 2023-09-20 11:11:55作者: 九极致之术

 

1.什么是SpringSecurity

进入移动互联网时代,大家每天都在刷手机,常用的软件有微信、支付宝、头条等,下边拿微信来举例子说明认证相关的基本概念,在初次使用微信前需要注册成为微信用户,然后输入账号和密码即可登录微信,输入账号和密码登录微信的过程就是认证。

系统为什么要认证?

认证是为了保护系统的隐私数据与资源,用户的身份合法方可访问该系统的资源。

认证:用户认证就是判断一个用户的身份是否合法的过程,用户去访问系统资源时系统要求验证用户的身份信息,身份合法方可继续访问,不合法则拒绝访问。常见的用户身份认证方式有:用户名密码登录,二维码登录,手机短信登录,指纹认证等方式。

Spring 是非常流行和成功的 Java 应用开发框架,Spring Security 正是 Spring 家族中的成员。Spring Security 基于 Spring 框架,提供了一套 Web 应用安全性的完整解决方案。

 

1.1 授权的数据模型

主体、资源、权限相关的数据模型如下:

主体(用户id、账号、密码、…)

权限(权限id、权限标识、权限名称、资源名称、资源访问地址、…)

角色(角色id、角色名称、…)

角色和权限关系(角色 id、权限id、…)

主体(用户)和角色关系(用户id、角色id、…)

 

 

1.2  SpringSecurity的核心功能:

用户认证(Authentication):系统判断用户是否能登录

用户授权(Authorization):系统判断用户是否有权限去做某些事情

SpringSecurity 特点:

Spring 技术栈的组成部分,与Spring 无缝整合。

全面的权限控制,能提供完整可扩展的认证和授权支持保护

专门为 Web 开发而设计。

重量级,需要引入各种家族组件与依赖

 

 2. 使用SpringSecurity

2.1 创建springboot勾选

可以在创建springboot工程时勾选Security的SpringSecurity的依赖包

 

2.2 自加依赖

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-security</artifactId>
</dependency>

 运行直接访问localhost:8080 会重定向到此页面

 

该页面在登录的时候默认的用户名是user密码显示在控制台

 

2.3 SpringSecurity 基本原理

SpringSecurity 本质是一个过滤器链,由许多过滤器组成,重点看一下几个过滤器:

(ctrl+N进行全局搜索)

ExceptionTranslationFilter: 异常过滤器,用来处理在认证授权过程中抛出的异常

 

表单登录

https://docs.spring.io/spring-security/reference/servlet/authentication/architecture.html

https://docs.spring.io/spring-security/reference/servlet/authentication/passwords/form.html

提交用户名和密码后,将对用户名和密码进行身份验证。 扩展了 AbstractAuthenticationProcessingFilter,因此下图应该看起来非常相似:

 

源码剖析:

 

 

2.4 自定义SpringSecurity账户和密码

2.4.1 根据application配置文件配置

spring.security.user.name=root

spring.security.user.password=root

 

2.4.2 根据配置类配置账户信息

 在config层中创建SecuityConfig 配置类

其中最重要的是让其 extends WebSecurityConfigurerAdapter 类 ,重写AuthenticationManagerBuilder方法

@Configuration
public class SecuityConfig extends WebSecurityConfigurerAdapter {

    //创建密码加密器
    @Bean
    public PasswordEncoder passwordEncoder(){
        return new BCryptPasswordEncoder();
    };
    //注入密码加密器
    @Autowired
    public PasswordEncoder passwordEncoder;

    @Override
    protected void configure(AuthenticationManagerBuilder auth) throws Exception {
        auth.inMemoryAuthentication()
                //账户
                .withUser("root")
                //该账户具备的角色
                .roles("ROOT")
                //密码---密码加密
                .password(passwordEncoder.encode("root"));
    }
}

 

3. 自定义认证

3.1 SecurityController配置类

3.2 创建service层且实现UserdetailService接口

3.3 controller层资源重定向

3.4 重定向success页面

3.5 自定义登录页面

 


以上便是SpringSecurity中的内容,如有漏缺请在下方留言告知,我会及时补充