SpringSecurity配置
功能
spring security 的核心功能主要包括:
-
认证 (你是谁)
-
授权 (你能干什么)
-
攻击防护 (防止伪造身份)
Spring Security是针对Spring项目的安全框架,也是Spring Boot底层安全模块默认的技术选型,他可以实现强大的Web安全控制,对于安全控制,我们仅需要引入spring-boot-starter-security模块,进行少量的配置,即可实 现强大的安全管理! 记住几个类:
-
WebSecurityConfigurerAdapter: 自定义Security策略
-
AuthenticationManagerBuilder: 自定义认证策略
-
@EnableWebSecurity: 开启WebSecurity模式 @EnableXXXX 开启某个功能
认证&授权
-
要想使用springsecurity,要引入依赖
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-security</artifactId>
</dependency>
-
配置类
-
配置授权的规则
-
定义认证规则
//定义认证规则
-
仅仅这样会报错:There is no PasswordEncoder mapped for the id “null”,原因,我们要将前端传过来的密码进行某种方式加密,否则就无法登录,修改代码。
//定义认证规则
权限控制和注销
-
开启自动配置的注销的功能
//注销功能
//防止跨站攻击
http.csrf().disable();
http.logout().logoutSuccessUrl("/");// .logoutSuccessUrl("/"); 注销成功之后进入的页面-
我们现在又来一个需求:
用户没有登录的时候,导航栏上只显示登录按钮,用户登录之后,导航栏可以显示登录的用户信息及注销按钮!还有就是,比如Gao这个用户,它只有 vip2,vip3功能,那么登录则只显示这两个功能,而vip1的功能菜单不显示!这个就是真实的网站情况了!该如何做呢?
我们需要结合thymeleaf中的一些功能
sec:authorize="isAuthenticated()":是否认证登录!来显示不同的页面
Maven依赖:
<!-- https://mvnrepository.com/artifact/org.thymeleaf.extras/thymeleaf-extras-springsecurity4 -->
<dependency>
<groupId>org.thymeleaf.extras</groupId>
<artifactId>thymeleaf-extras-springsecurity5</artifactId>
<version>3.0.4.RELEASE</version>
</dependency>修改我们的 前端页面,导入命名空间。
xmlns:sec="http://www.thymeleaf.org/thymeleaf-extras-springsecurity5"
修改导航栏,认证判断
<!--登录注销-->
<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">
用户名:<span sec:authentication="name"></span>
</a>
</div>
<div sec:authorize="isAuthenticated()">
<a class="item" th:href="@{/logout}">
<i class="sign-out card icon"></i> 注销
</a>
</div>-
如果注销404了,就是因为它默认防止csrf跨站请求伪造,因为会产生安全问题,我们可以将请求改为post表单提交,或者在spring security中关闭csrf功能;我们试试:在 配置中增加
http.csrf().disable();
-
角色认证模块
<div>
<br>
<div class="ui three column stackable grid">
<!-- 如果有VIP1角色,就显示下面内容-->
<div class="column" sec:authorize="hasRole('vip1')">
<div class="ui raised segment">
<div class="ui">
<div class="content">
<h5 class="content">Level 1</h5>
<hr>
<div><a th:href="@{/level1/1}"><i class="bullhorn icon"></i> Level-1-1</a></div>
<div><a th:href="@{/level1/2}"><i class="bullhorn icon"></i> Level-1-2</a></div>
<div><a th:href="@{/level1/3}"><i class="bullhorn icon"></i> Level-1-3</a></div>
</div>
</div>
</div>
</div>
<!-- 如果有VIP2角色,就显示下面内容-->
<div class="column" sec:authorize="hasRole('vip2')">
<div class="ui raised segment">
<div class="ui">
<div class="content">
<h5 class="content">Level 2</h5>
<hr>
<div><a th:href="@{/level2/1}"><i class="bullhorn icon"></i> Level-2-1</a></div>
<div><a th:href="@{/level2/2}"><i class="bullhorn icon"></i> Level-2-2</a></div>
<div><a th:href="@{/level2/3}"><i class="bullhorn icon"></i> Level-2-3</a></div>
</div>
</div>
</div>
-
-