🏇
s
p
r
i
n
g
b
o
o
t
中
如
何
加
入
安
全
\textcolor{Orange}{springboot中如何加入安全}
springboot中如何加入安全 🙏
学
习
过
程
中
的
笔
记
,
方
便
查
阅
学
习
\textcolor{green}{学习过程中的笔记,方便查阅学习}
学习过程中的笔记,方便查阅学习💗 🍣
笔
记
总
结
来
源
于
视
频
B
站
狂
神
说
\textcolor{green}{笔记总结来源于视频B站狂神说}
笔记总结来源于视频B站狂神说🍣 欢迎各位小伙伴😄关注👍点赞??收藏📝留言
安全是非功能性需求。
官网:https://spring.io/projects/spring-security
做网站:安全应该在设计开始的时候就考虑。
shiro,SpringSecurity:除了类和名字不一样,其他都一样。主要功能就是认证和授权。
用于:功能权限,访问权限,菜单权限
实际操作
-
创建项目并将web模块和Thymeleaf模块引入 -
将静态文件导入 -
将模板引擎的缓存关掉,方便调试 spring.thymeleaf.cache=false
-
配置controller package com.hxl.controller;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
@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;
}
}
-
启动测试localhost:8080 成功运行即可
Spring Security
Spring Security 是针对Spring项目的安全框架,也是Spring Boot底层安全模块默认的技术选型,他可以实现强大的Web安全控制,对于安全控制,我们仅需要引入 spring-boot-starter-security 模块,进行少量的配置,即可实现强大的安全管理!
记住几个类:
- WebSecurityConfigurerAdapter:自定义Security策略
- AuthenticationManagerBuilder:自定义认证策略
- @EnableWebSecurity:开启WebSecurity模式
Spring Security的两个主要目标是 “认证” 和 “授权”(访问控制)。
“认证”(Authentication)
身份验证是关于验证您的凭据,如用户名/用户ID和密码,以验证您的身份。
身份验证通常通过用户名和密码完成,有时与身份验证因素结合使用。
“授权” (Authorization)
授权发生在系统成功验证您的身份后,最终会授予您访问资源(如信息,文件,数据库,资金,位置,几乎任何内容)的完全权限。
这个概念是通用的,而不是只在Spring Security 中存在。
认证授权
-
引入Spring Security模块 <dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-security</artifactId>
</dependency>
-
编写config 官方网址:https://spring.io/projects/spring-security -
编写基础配置类 package com.hxl.config;
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;
@EnableWebSecurity
public class Security extends WebSecurityConfigurerAdapter {
@Override
protected void configure(HttpSecurity http) throws Exception {
super.configure(http);
}
}
-
定制授权 @Override
protected void configure(HttpSecurity http) throws Exception {
http.authorizeRequests()
.antMatchers("/").permitAll()
.antMatchers("/level1/**").hasRole("vip1")
.antMatchers("/level2/**").hasRole("vip2")
.antMatchers("/level3/**").hasRole("vip3");
}
-
测试 此时发现,除了首页之外,其他的都进不去,这是因为没有登录角色的权限 -
开启登录配置 在上面的定制授权方法里面,加入下面代码
http.formLogin();
-
测试 如果没有权限,会自动跳转到登录页面,并且跳转链接为http://localhost:8080/login -
认证
@Override
protected void configure(AuthenticationManagerBuilder auth) throws Exception {
auth.inMemoryAuthentication()
.withUser("hxl").password("{noop}123456").roles("vip1","vip2")
.and()
.withUser("root").password("{noop}123456").roles("vip1","vip2","vip3")
.and()
.withUser("wode").password("{noop}123456").roles("vip1");
}
-
注意看上面 发现在密码那一栏中增加了一个{noop} 这是因为如果不添加这个就会报下面这个问题 这是由于加密的原因,前端传过来的密码要进行某种方式的加密,当然除了上述的方法之外还可以用下面的方式进行加密。 auth.inMemoryAuthentication().passwordEncoder(new BCryptPasswordEncoder())
.withUser("hxl").password(new BCryptPasswordEncoder().encode("123456")).roles("vip1","vip2");
这种方式也是可以的。官方推荐的是使用bcrypt加密方式 -
测试 这样之后发现每个用户只能访问自己认证下的规则。不能访问其他的,否则会报错
权限控制和注销
-
首先开启配置的注销功能 加上后面的logoutSuccessUrl 就是注销成功后,依旧可以跳转到首页
@Override
protected void configure(HttpSecurity http) throws Exception {
http.logout().logoutSuccessUrl("/");
}
-
增加一个注销按钮
<a class="item" th:href="@{/logout}">
<i class="sign-out icon"></i> 注销
</a>
-
测试 点击即可注销,并且可以返回首页。 -
功能优化
登录成功后,导航栏显示用户信息以及注销按钮。没有登录则只显示登录按钮。同时首页显示只显示用户拥有权限的页面。
-
登录注销以及用户信息
-
下载依赖
<dependency>
<groupId>org.thymeleaf.extras</groupId>
<artifactId>thymeleaf-extras-springsecurity5</artifactId>
<version>3.0.4.RELEASE</version>
</dependency>
-
在index.html 中 加上命名空间 xmlns:sec="http://www.thymeleaf.org/thymeleaf-extras-springsecurity5"
如果在编写下面的sec的时候没有提示,则修改命名空间为 xmlns:sec="http://www.thymeleaf.org/extras/spring-security">
修改登录注销功能及导航栏
<div class="right menu">
<div sec:authorize="!isAuthenticated()">
<a class="item" th:href="@{/toLogin}">
<i class="address card icon"></i> 登录
</a>
</div>
<div sec:authorize="isAuthenticated()">
<a class="item">
<i class="address card icon"></i>
用户名:<span sec:authentication="principal.username"></span>
角色:<span sec:authentication="principal.authorities"></span>
</a>
</div>
<div sec:authorize="isAuthenticated()">
<a class="item" th:href="@{/logout}">
<i class="address card icon"></i> 注销
</a>
</div>
</div>
-
角色功能认证 以一个为例,其他的将其加上即可。 <div class="column" sec:authorize="hasRole('vip1')">
-
测试 -
注意登录的时候我们必须去http://localhost:8080/login 这个页面,而不是我们最开始的http://localhost:8080/toLogin 。接下来就解决这个问题。
记住我
@Override
protected void configure(HttpSecurity http) throws Exception {
http.authorizeRequests()
.antMatchers("/").permitAll()
.antMatchers("/level1/**").hasRole("vip1")
.antMatchers("/level2/**").hasRole("vip2")
.antMatchers("/level3/**").hasRole("vip3");
http.formLogin();
http.logout().logoutSuccessUrl("/");
http.rememberMe();
}
这个是默认的登录,如果需要在自己的登录页面进行登录还需要操作
怎么完成的呢?
我们关闭浏览器后,再次登录,可以发现用户还是存在的。那么如何实现呢?我们查看一下浏览器的cookie ,发现了他,并且默认保存时间是两周。
登录成功后,将cookie发送给浏览器保存,以后登录带上这个cookie,只要通过检查就可以免登录了。而一旦手动删除后cookie 后,那么就不会存在了。
一个完整的首页
只需要在后面增加这一个代码即可。但是要注意和前端的要保持一致。
http.formLogin().loginPage("/toLogin");
如果前端是login 那么后端就需要变成
http.formLogin().loginPage("/toLogin").loginProcessingUrl("/login");
同时如果表单的信息如果和默认信息不一致那么就需要进行修改
http.formLogin().usernameParameter("username").passwordParameter("password").loginPage("/toLogin").loginProcessingUrl("/login");
至此就结束了。
测试
|