Spring Boot Security
1、集成Spring Security
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-security</artifactId>
</dependency>
2、前端页面的简单编写
Spring Boot 笔记(Security)Spring Boot Security实现对应角色用户,只显示对应页面效果图自定义security的登录、登录失败、注销页面 <body>
<a href="level1/1">level1:1</a>
<a href="level1/2">level1:2</a>
<a href="level1/3">level1:3</a>
<br>
<hr>
<a href="level2/1">level2:1</a>
<a href="level2/2">level2:2</a>
<a href="level2/3">level2:3</a>
<br>
<hr>
<a href="/logout">注销</a>
</body>
Spring Boot 笔记(Security)Spring Boot Security实现对应角色用户,只显示对应页面效果图自定义security的登录、登录失败、注销页面 3、控制器实现页面跳转
@Controller
public class SecurityController {
@RequestMapping("/")
public String index(){
return "index";
}
@RequestMapping("/level1/{id}")
public String level1(@PathVariable("id") Integer id){
return "level1/level"+id;
}
@RequestMapping("/level2/{id}")
public String level2(@PathVariable("id") Integer id){
return "level2/level"+id;
}
}
4、注册Spring Security安全权限
//开启安全权限(交给spring托管了)
@EnableWebSecurity
//注册一个安全权限
public class SecurityConfig extends WebSecurityConfigurerAdapter {
//重写授权与认证的方法
}
5、重写授权方法
@Override
//授权(哪些角色可以访问哪些页面)
protected void configure(HttpSecurity http) throws Exception {
//首页所有人可以访问,功能页只有对应权限的人才能访问
//添加请求授权规则
http.authorizeRequests()
.antMatchers("/").permitAll()
.antMatchers("/level1/**").hasRole("vip1")
.antMatchers("/level2/**").hasRole("vip2")
.antMatchers("/level3/**").hasRole("vip3");
//没有权限时,默认到登录页面,默认的url是/login
http.formLogin();
/*注销,注销页面的默认url是/logout;注销后跳转到首页*/
http.logout().logoutSuccessUrl("/");
//开启记住我功能(cookie的原理,默认保存两周)
http.rememberMe();
}
6、重写认证方法
/*
* 认证
* 若登录后出现:There is no PasswordEncoder mapped for the id "null" 500错误
* spring security 5.0+ 登录的密码必须被加密,需要添加加密方式 xxxPasswordEncoder
* */
@Override
protected void configure(AuthenticationManagerBuilder auth) throws Exception {
//正常情况下,这些用户认证是通过数据库中读取
//从内存中读取认证(可以添加多个用户认证,使用密码加密;用and方法进行分隔)
auth.inMemoryAuthentication().passwordEncoder(new BCryptPasswordEncoder())
.withUser("maki").password(new BCryptPasswordEncoder().encode("123")).roles("vip1")
.and()
.withUser("root").password(new BCryptPasswordEncoder().encode("123")).roles("vip1","vip2");
}
实现对应角色用户,只显示对应页面
1、thymeleaf与spring security的整合
<!--security与thymeleaf的整合-->
<dependency>
<groupId>org.thymeleaf.extras</groupId>
<artifactId>thymeleaf-extras-springsecurity5</artifactId>
</dependency>
2、thymeleaf中引入约束
<html lang="en"
xmlns:th="http://www.thymeleaf.org"
xmlns:sec="http://www.thymeleaf.org/thymeleaf-extras-springsecurity5">
3、若未登录,只显示登录
<!--
若未登录,显示登录
判断用户是否已认证
-->
<div sec:authorize="!isAuthenticated()">
<a th:href="@{/login}">登录:security的默认登录页</a>
<br>
</div>
4、若已登录显示用户名、注销、以及对应角色所对应的页面
<!--
若已登录,显示用户名、注销、对应角色显示的对应页
判断用户是否已认证
-->
<div sec:authorize="isAuthenticated()">
<!--身份认证:获取用户名,角色-->
用户名:<span sec:authentication="name"></span>
角色:<span sec:authentication="principal.authorities"></span>
<a href="/logout">注销:security的默认注销页</a>
<br>
<!--VIP1用户,显示的页面-->
<div sec:authorize="hasRole('vip1')">
<a href="level1/1">level1:1</a>
<a href="level1/2">level1:2</a>
<a href="level1/3">level1:3</a>
<br>
</div>
<!--VIP2用户,显示的页面-->
<div sec:authorize="hasRole('vip2')">
<a href="level2/1">level2:1</a>
<a href="level2/2">level2:2</a>
<a href="level2/3">level2:3</a>
<br>
</div>
</div>
效果图
1、未登录状态
Spring Boot 笔记(Security)Spring Boot Security实现对应角色用户,只显示对应页面效果图自定义security的登录、登录失败、注销页面 2、security自带的登录页
Spring Boot 笔记(Security)Spring Boot Security实现对应角色用户,只显示对应页面效果图自定义security的登录、登录失败、注销页面 3、使用maki账户(VIP1权限)登录
Spring Boot 笔记(Security)Spring Boot Security实现对应角色用户,只显示对应页面效果图自定义security的登录、登录失败、注销页面 4、使用root账户(所有权限)登录
Spring Boot 笔记(Security)Spring Boot Security实现对应角色用户,只显示对应页面效果图自定义security的登录、登录失败、注销页面 5、security自带的注销页
Spring Boot 笔记(Security)Spring Boot Security实现对应角色用户,只显示对应页面效果图自定义security的登录、登录失败、注销页面 自定义security的登录、登录失败、注销页面
1、注册spring security,开启安全权限,添加授权
//开启安全权限(交给spring托管了)
@EnableWebSecurity
//注册一个安全权限
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");
/*
没有权限时,默认到登录页面,使用自定义的登录页
如何获取自定义登录页的表单数据?
security默认接受的表单数据的参数name是:username&password
*/
http.formLogin().loginProcessingUrl("/toLogin")
.usernameParameter("user")
.passwordParameter("pwd");
/*注销,注销页面的默认url是/logout;注销后跳转到首页*/
http.logout().logoutSuccessUrl("/");
/*
开启记住我功能(cookie的原理,默认保存两周)
若使用自定义登录页,需要指定记住我checkbox标签的name值
*/
http.rememberMe().rememberMeParameter("remember");
}