SpringBoot-Security

简介

Spring Security 是针对Spring项目的安全框架,也是Spring Boot底层安全模块默认的技术选型,他可以实现强大
的Web安全控制,对于安全控制,我们仅需要引入spring-boot-starter-security模块,进行少量的配置,即可实
现强大的安全管理!

Spring Security的两个主要目标是“认证”和“授权”(访问控制)
“认证”(Authentication)
“授权” (Authorization)
这个概念是通用的,而不是只在Spring Security 中存在。

基本使用

  1. 导入依赖
1
2
3
4
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-security</artifactId>
</dependency>
  1. 继承WebSecurityConfigurerAdapter
1
2
3
@EnableWebSecurity
public class SecurityConfig extends WebSecurityConfigurerAdapter {
}
  1. 重写以下方法做出权限设置
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
@Override
protected void configure(HttpSecurity http) throws Exception {
//首页都可以访问,但是各个级别下的页面设置成只能各自的级别才可以访问
http.authorizeRequests()
.antMatchers("/").permitAll()
.antMatchers("/vip1/**").hasRole("vip1")
.antMatchers("/vip2/**").hasRole("vip2")
.antMatchers("/vip3/**").hasRole("vip3");
//没有权限默认回到登录页面,loginPage设置登录页面,loginProcessingUrl设置登录提交的api
//如果只写 http.formLogin();会有一个默认登录页面和默认的登录提交的api
http.formLogin().loginPage("/login").loginProcessingUrl("/user/api/login");
//设置退出时候使session失效,logoutSuccessUrl设置退出成功的页面
http.logout().invalidateHttpSession(true).logoutSuccessUrl("/index");
//设置’记住我‘的功能
//remember-me为默认提交的参数
http.rememberMe().rememberMeParameter("remember");
}
  1. 重写以下方法做出授权处理
1
2
3
4
5
6
7
8
9
10
11
12
@Override
protected void configure(AuthenticationManagerBuilder auth) throws Exception {
/**
* 这里要从数据库读
*/
//BCryptPasswordEncoder为密码设置加密,如果不设置会报错,也可以使用其他加密的类
BCryptPasswordEncoder encoder = new BCryptPasswordEncoder();
auth.inMemoryAuthentication().passwordEncoder(encoder)
.withUser("zhima").password(encoder.encode("a")).roles("vip1","vip3")
.and()
.withUser("lizhi").password(encoder.encode(("123456"))).roles("vip1","vip2","vip3");
}
  1. 测试

thymeleaf模板结合SpringSecurity

导入依赖

1
2
3
4
5
<dependency>
<groupId>org.thymeleaf.extras</groupId>
<artifactId>thymeleaf-extras-springsecurity5</artifactId>
<version>3.0.4.RELEASE</version>
</dependency>

观察这个页面的使用

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
<!DOCTYPE html>
<html lang="en" xmlns:th="http://www.thymeleaf.org"
xmlns:sec="http://www.thymeleaf.org/thymeleaf-extras-springsecurity4">
<head>
<meta charset="UTF-8">
<title>首页</title>
</head>
<body>
<div sec:authorize="!isAuthenticated()">
<!--sec:authorize="!isAuthenticated()"当用户没登录的时候-->
<p>首页</p>
<p><a th:href="@{/login}">登录</a></p>
</div>

<div sec:authorize="isAuthenticated()">
<!--sec:authorize="isAuthenticated()"当用户登录的时候-->
用户名:<span sec:authentication="name"></span>
<!--sec:authentication="name"取出用户的用户名-->
授权:<span sec:authentication="principal.authorities"></span>
<!--sec:authentication="principal.authorities"取出用户的roles-->
<p><a th:href="@{/logout}">注销</a></p>
</div>
<div sec:authorize="hasRole('vip1')">
<!--sec:authorize="hasRole('vip1')"如果当前登录用户有vip1权限则显示此div-->
<span>vip1</span>
<ul>
<li><a th:href="@{vip1/1}">vip1-1</a></li>
<li><a th:href="@{vip1/2}">vip1-2</a></li>
<li><a th:href="@{vip1/3}">vip1-3</a></li>
</ul>
</div>
<div sec:authorize="hasRole('vip2')">
<!--sec:authorize="hasRole('vip2')"如果当前登录用户有vip2权限则显示此div-->
<span>vip2</span>
<ul>
<li><a th:href="@{vip2/1}">vip2-1</a></li>
<li><a th:href="@{vip2/2}">vip2-2</a></li>
<li><a th:href="@{vip2/3}">vip2-3</a></li>
</ul>
</div>
<div sec:authorize="hasRole('vip3')">
<!--sec:authorize="hasRole('vip3')"如果当前登录用户有vip3权限则显示此div-->
<span>vip3</span>
<ul>
<li><a th:href="@{vip3/1}">vip3-1</a></li>
<li><a th:href="@{vip3/2}">vip3-2</a></li>
<li><a th:href="@{vip3/3}">vip3-3</a></li>
</ul>
</div>
</body>
</html>
给作者买杯咖啡吧~~~