SpringSecurity
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中的内容,如有漏缺请在下方留言告知,我会及时补充