关于安全框架这一块,SpringSecurity可谓是被普遍使用!让我们来学习一下!
开始之前让我们先牢记两个英语单词:
- Authentication认证
什么是认证呢?就是通过判断用户输入的账户密码,是否与要登录的用户一致。 - Authorization授权
那么授权就是,首先给一个请求赋予一个能访问的权限,然后给予用户一些权限,只有权限具有能够访问的权限那么就完成了访问成功的操作!
那么接下来我们结合实际案例来学习一下SpringSecurity!
1.引入Security的启动器
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-security</artifactId>
</dependency>
2.配置一个Security的配置类
@EnableWebSecurity//开启Security模式
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页面,认证失败走login?error页面
//将自己的页面代替SpringSecurity的Login页面.loginPage("/toLogin")
// .loginProcessingUrl("/login")实际完成用户名认证的
http.formLogin().loginPage("/toLogin");
//开启注销功能,注销成功后跳转的页面
http.logout().logoutSuccessUrl("/");
http.csrf().disable();//关闭csrf功能:跨站请求伪造,默认只能通过post方式提交logout请求
//开启记住我功能,本质是cookie保存起来时间默认为半个月(15天)
http.rememberMe();
}
@Override
//认证
//passwordEncoding
protected void configure(AuthenticationManagerBuilder auth) throws Exception {
//这些数据一般从数据库当中去读,此处使用了内存读取数据
auth.inMemoryAuthentication().passwordEncoder(new BCryptPasswordEncoder())//加密方式
.withUser("songqixiang").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");
}
配置我们从上面可以总结出一个具体的流程,首先是为请求定制规则,只有具有对应的权限才可以进行访问,定制规则后,如果我们去认证如果认证失败或没有认证成功的话,发起/login请求跳转到SpringSecurity默认的login页面,让我们进行认证,然后我们从数据库或者内存中取出数据与用户输入的数据比对,知道数据匹配一致的情况下才会认证成功,认证成功后,当前即可根据当前用户的权限进行访问,可以访问的请求!
扩展:如果我们想要增加自己的页面或者注销当前用户的等等功能,我们需要再配置一些内容
- 使用自己的Login页面替代默认的: http.formLogin().loginPage("/toLogin");
- 开启注销功能,以及注销成功后跳转的页面: http.logout().logoutSuccessUrl("/");
- 关闭csrf功能:跨站请求伪造:http.csrf().disable();(如果不写上会出现登录或注销中的一个有问题!404)
- 开启记住我功能,将当前用户的信息保存在一个cookie当中,有效期为15天:http.rememberMe();
上面是SpringSecurity需要配置的一些注意点!当我们用的时候一般会与Thymeleaf模板引擎相结合,让前端可以简单快捷的判断出来当前用户是否被认证或者是否拥有某个权限,来达到加符合实际的设计!
联合使用很简单,因为开发者已经准备好了启动器,只需要我们引入即可,然后搭配结合的标签实现上述判断
1.引入启动器
<!--Thymeleaf和SpringSecurity的整合包-->
<dependency>
<groupId>org.thymeleaf.extras</groupId>
<artifactId>thymeleaf-extras-springsecurity5</artifactId>
<version>3.0.4.RELEASE</version>
</dependency>
2.常用的联合标签:
- 首先是先引入一个命名空间!
<html lang="en" xmlns:th="http://www.thymeleaf.org"
xmlns:sec="http://www.thymeleaf.org/extras/spring-security">
接下来常用的标签
<div sec:authorize="!isAuthenticated()">当前用户没有被认证/认证失败
<div sec:authorize="isAuthenticated()">当前用户认证成功
<div sec:authorize="hasRole('vip1')">当前用户有vip1的权限的情况下