✨【一心同学】博客的领域是【面向后端技术】的学习,未来会持续更新更多的【后端技术】以及【学习心得】。
✨如果有对【后端技术】感兴趣的【小可爱】,欢迎关注【一心同学】💞💞💞
❤️❤️❤️**感谢各位大可爱小可爱!**❤️❤️❤️
目录
1.前言
(1)用户认证 (你是谁)
(2)用户授权 (你能干什么)
2.准备工作
3. 增加上认证和授权的功能
4.权限控制和注销
5.开启“记住我”功能
6.实现两个需求
7.自定义登录界面
8.完整配置类
结语
1.前言
====
在上一篇博客已经讲完了SpringSecurity与OAuth的概念,了解到Spring Security是一个功能强大且高度可定制的身份验证和访问控制框架。
我们重新回顾下Spring Security的核心功能:
(1)用户认证 (你是谁)
用户认证指的是验证某个用户是否为系统中的合法主体,也就是说用户能否访问该系统。
(2)用户授权 (你能干什么)
用户授权指的是验证某个用户是否有权限执行某个操作。
本篇博客将直接进行实操,我们来实现一个项目:
等级 | 权限 |
VIP1 | 访问level1目录下的静态资源 |
VIP2 | 访问level2目录下的静态资源 |
VIP3 | 访问level3目录下的静态资源 |
注:以下对SpringSecurity的搭建有参考【狂神】教学。
2.准备工作
======
1.新建一个初始的springboot项目web模块,thymeleaf模块
2.建立静态资源
3.编写Controller类
@Controller
public class RouterController {
@RequestMapping({“/”,“/index”})
public String index(){
return “index”;
}
@RequestMapping(“/toLogin”)
public String toLogin(){
return “views/login”;
}
@RequestMapping(“/level1/{id}”)
public String level1(@PathVariable(“id”) int id){
return “views/level1/”+id;
}
@RequestMapping(“/level2/{id}”)
public String level2(@PathVariable(“id”) int id){
return “views/level2/”+id;
}
@RequestMapping(“/level3/{id}”)
public String level3(@PathVariable(“id”) int id){
return “views/level3/”+id;
}
}
4.测试以上步骤是否成功
启动项目
首页:
登录页:
成功!
但我们目前是可以任意对level1~level3进行随意访问的,接着我们要做的就是只有相应权限的人才可以进行访问。
3. 增加上认证和授权的功能
==============
(1)导入Security依赖:
org.springframework.boot
spring-boot-starter-security
(2)编写 Spring Security 配置类
重写WebSecurityConfigurerAdapter的两个配置方法:
configure(HttpSecurity http):定制请求的授权规则
configure(AuthenticationManagerBuilder auth):定义认证规则
package com.yixin.demo.config;
import org.springframework.security.config.annotation.authentication.builders.AuthenticationManagerBuilder;
import org.springframework.security.config.annotation.web.builders.HttpSecurity;
import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity;
import org.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter;
import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder;
@EnableWebSecurity// 开启WebSecurity模式
public class SecurityConfig extends WebSecurityConfigurerAdapter {
@Override
protected void configure(HttpSecurity http) throws Exception {
// 首页所有人都可以访问,功能也只有对应有权限的人才能访问到
// 请求授权的规则
http.authorizeRequests()
.antMatchers(“/”).permitAll()
.antMatchers(“/level1/**”).hasRole(“vip1”)
.antMatchers(“/level2/**”).hasRole(“vip2”)
.antMatchers(“/level3/**”).hasRole(“vip3”);
// 开启自动配置的登录功能
// /login 请求来到登录页,如果没有指定默认登录界面,则会采用Security的默认登录界面
// /login?error 重定向到这里表示登录失败
http.formLogin();
}
//定义认证规则
@Override
protected void configure(AuthenticationManagerBuilder auth) throws Exception {
//在内存中定义,也可以在jdbc中去拿…
//Spring security 5.0中新增了多种加密方式,也改变了密码的格式。
//要想我们的项目还能够正常登陆,需要修改一下configure中的代码。我们要将前端传过来的密码进行某种方式加密
//spring security 官方推荐的是使用bcrypt加密方式。
auth.inMemoryAuthentication().passwordEncoder(new BCryptPasswordEncoder())
.withUser(“yixin”).password(new BCryptPasswordEncoder().encode(“123456”)).roles(“vip2”,“vip3”)
.and()
.withUser(“root”).password(new BCryptPasswordEncoder().encode(“123456”)).roles(“vip1”,“vip2”,“vip3”)
.and()
.withUser(“guest”).password(new BCryptPasswordEncoder().encode(“123456”)).roles(“vip1”,“vip2”);
}
}
(3)此时我们再重新尝试启动
我们点击Level2。
发现进入了SpringSecurity的默认登录界面,注意该界面并不是我们自定义的。
我们输入以下信息:
user: yixin
pwd: 123456
我们对yixin这个用户给予的权限是vip2和vip3,也就是说yixin可以访问level2和level3,但是访问不了level1;
我们进行测试:
level2测试:
登录:
Level2目录下的页面可以成功进入。
测试level1目录:
点击:
可以发现我们无法访问level1目录下的静态资源,因为我们没有给yixin用户设置相应的权限。
4.权限控制和注销
=========
(1)主页面index.html增加一个注销的按钮
注销
(2)开启自动配置的注销的功能
//定制请求的授权规则
@Override
protected void configure(HttpSecurity http) throws Exception {
//…
//开启自动配置的注销的功能
// /logout 注销请求
http.logout();
}
测试:
登录成功后点击注销
点击注销后会出来一个提示:
点击log out,就会跳转到登录界面。
如果我们想让他注销成功后,依旧可以跳转到首页,应进行如下处理:
// .logoutSuccessUrl(“/”); 注销成功来到首页
http.logout().logoutSuccessUrl(“/”);
测试成功!注销后跳转到首页。
5.开启“记住我”功能
===========
现在的情况,我们只要登录之后,关闭浏览器,再进入网页,就会让我们重新登录,但是我们要实现的是当我们在该网站登录过一次,接着关闭网页,下一次进入该网站就不需要再进行登录了。
(1)SpringSecurity开启“记住我”配置:
protected void configure(HttpSecurity http) throws Exception {
//…
//开启记住我功能: cookie,默认保存两周,自定义接收前端的参数
http.rememberMe();
}
(2)启动项目测试
可以发现,这里多了一个Remember的标记
我们登录之后关闭 浏览器,然后重新打开浏览器访问,可以发现访问不需要登录了。
我们去查看一下浏览器的cookie,可以发现它的默认保存时间是14天。
我们点击注销的时候,可以发现,spring security 帮我们自动删除了这个 cookie
(3)原理
cookie发送给浏览器保存,以后登录带上这个cookie,只要通过检查就可以免登录了。如果点击注销,则会删除这个cookie。
6.实现两个需求
========
(1_)用户没有登录的时候,导航栏上只显示登录按钮,用户登录之后,导航栏可以显示登录的用户信息及注销按钮。_
(2)根据用户的权限,显示相应的页面,如yixin这个用户,它只有 vip2,vip3功能,那么登录则只显示这两个功能,而vip1的功能菜单不显示。
(1)导入依赖
org.thymeleaf.extras
thymeleaf-extras-springsecurity5
3.0.4.RELEASE
-
整合包4(springsecurity4)——springboot版本2.0.9
-
整合包5(springsecurity5)——springboot版本之后
(2)thymeleaf的功能
sec:authorize=“isAuthenticated()”:是否认证登录!来显示不同的页面
(3)实现需求一
index.html
登录
自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。
深知大多数Java工程师,想要提升技能,往往是自己摸索成长或者是报班学习,但对于培训机构动则几千的学费,着实压力不小。自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!
因此收集整理了一份《2024年Java开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。
既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上Java开发知识点,真正体系化!
由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且会持续更新!
如果你觉得这些内容对你有帮助,可以扫码获取!!(备注Java获取)
总结
上述知识点,囊括了目前互联网企业的主流应用技术以及能让你成为“香饽饽”的高级架构知识,每个笔记里面几乎都带有实战内容。
很多人担心学了容易忘,这里教你一个方法,那就是重复学习。
打个比方,假如你正在学习 spring 注解,突然发现了一个注解@Aspect,不知道干什么用的,你可能会去查看源码或者通过博客学习,花了半小时终于弄懂了,下次又看到@Aspect 了,你有点郁闷了,上次好像在哪哪哪学习,你快速打开网页花了五分钟又学会了。
从半小时和五分钟的对比中可以发现多学一次就离真正掌握知识又近了一步。
人的本性就是容易遗忘,只有不断加深印象、重复学习才能真正掌握,所以很多书我都是推荐大家多看几遍。哪有那么多天才,他只是比你多看了几遍书。
《一线大厂Java面试题解析+核心总结学习笔记+最新讲解视频+实战项目源码》,点击传送门即可获取!
将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且会持续更新!**
如果你觉得这些内容对你有帮助,可以扫码获取!!(备注Java获取)
总结
上述知识点,囊括了目前互联网企业的主流应用技术以及能让你成为“香饽饽”的高级架构知识,每个笔记里面几乎都带有实战内容。
很多人担心学了容易忘,这里教你一个方法,那就是重复学习。
打个比方,假如你正在学习 spring 注解,突然发现了一个注解@Aspect,不知道干什么用的,你可能会去查看源码或者通过博客学习,花了半小时终于弄懂了,下次又看到@Aspect 了,你有点郁闷了,上次好像在哪哪哪学习,你快速打开网页花了五分钟又学会了。
从半小时和五分钟的对比中可以发现多学一次就离真正掌握知识又近了一步。
[外链图片转存中…(img-stiCkbqy-1712070862723)]
人的本性就是容易遗忘,只有不断加深印象、重复学习才能真正掌握,所以很多书我都是推荐大家多看几遍。哪有那么多天才,他只是比你多看了几遍书。
《一线大厂Java面试题解析+核心总结学习笔记+最新讲解视频+实战项目源码》,点击传送门即可获取!