初识SpringSecurity
spring-security
在spring
的官网即可找到 spring-security
spring-security
官方文档的地址 https://docs.spring.io/spring-security/site/docs/
spring-security
是Spring
系列的关于安全的框架,还有一套安全的框架是Shiro
环境的搭建
项目使用的素材
链接:https://pan.baidu.com/s/1nrIcZYDxefdYn0sXR085mw?pwd=dqvt
提取码:dqvt
spring-boot
的版本选用较低的,是为了用户在登录之后在首页的界面显示用户的名字和角色以及注销的信息,因为需要thymeleaf-extras-springsecurity4
这个包,与高版本的不兼容。
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.0.7.RELEASE</version>
<relativePath/>
</parent>
其他的依赖
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
<version>2.5.1</version>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-security</artifactId>
</dependency>
<dependency>
<groupId>org.thymeleaf.extras</groupId>
<artifactId>thymeleaf-extras-springsecurity4</artifactId>
<version>3.0.4.RELEASE</version>
</dependency>
<dependency>
<groupId>org.thymeleaf</groupId>
<artifactId>thymeleaf-spring5</artifactId>
</dependency>
<dependency>
<groupId>org.thymeleaf.extras</groupId>
<artifactId>thymeleaf-extras-java8time</artifactId>
</dependency>
</dependencies>
相关配置
spring:
thymeleaf:
cache: false
server:
port: 80
编写路由控制器,不同的用户在使用的权限的不同,可以跳转的页面也不同
@Controller
public class RouterController {
@GetMapping({"/","/index"})
public String index(){
return "index";
}
@RequestMapping("/login")
public String login(){
return "views/login";
}
@GetMapping("/level1/{id}")
public String level1(@PathVariable("id") Integer id){
return "/views/level1/"+id;
}
@GetMapping("/level2/{id}")
public String level2(@PathVariable("id") Integer id){
return "/views/level2/"+id;
}
@GetMapping("/level3/{id}")
public String level3(@PathVariable("id") Integer id){
return "/views/level3/"+id;
}
}
编写配置类,开启spring-security
的安全功能。
@EnableWebSecurity
public class WebSecurityConfig 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");
// 没有权限会默认到登录页面
http.formLogin().loginPage("/login").usernameParameter("username").passwordParameter("password");
// 关闭防止跨站防止脚本攻击
http.csrf().disable();
// 注销之后到首页
http.logout().logoutSuccessUrl("/");
// 记住我功能的实现
http.rememberMe().rememberMeParameter("remember-security");
}
// 密码加密,在springSecurity5+ 新增加密规则
@Override
protected void configure(AuthenticationManagerBuilder auth) throws Exception {
auth.inMemoryAuthentication().passwordEncoder(new BCryptPasswordEncoder())
.withUser("root").password(new BCryptPasswordEncoder().encode("123456")).roles("vip1","vip2","vip3")
.and()
.withUser("mao").password(new BCryptPasswordEncoder().encode("123456")).roles("vip1","vip2")
.and()
.withUser("coffee").password(new BCryptPasswordEncoder().encode("123456")).roles("vip3");
}
}
前端对接
导入域名空间,为了在首页显示用户名和权限
xmlns:sec="http://www.thymeleaf.org/thymeleaf-extras-springsecurity4">
控制显示
<!--未登录-->
<div sec:authorize="!isAuthenticated()">
<a class="item" th:href="@{/login}">
<i class="address card icon"></i> 登录
</a>
</div>
<div sec:authorize="isAuthenticated()">
<a class="item">
用户名<span sec:authentication="name"></span>
角色<span sec:authentication="principal.authorities"></span>
</a>
</div>
<div sec:authorize="isAuthenticated()">
<a class="item" th:href="@{/logout}">
<i class="sign-out icon"></i> 注销
</a>
</div>
在对应的权限的部分加上权限控制器
<div class="column" sec:authorize="hasRole('vip1')"></div>
注意点
注意前后端传递数据的对接情况