org.springframework.boot
spring-boot-starter-parent
2.2.3.RELEASE
org.springframework.boot
spring-boot-starter-web
org.springframework.boot
spring-boot-starter-thymeleaf
org.springframework.boot
spring-boot-starter-security
server:
port: 9000
#关闭thymeleaf缓存
spring:
thymeleaf:
cache: false
resources/templates/index.html
index
resources/templates/level1/index.html
resources/templates/level2/index.html
resources/templates/level3/index.html
level1
level1
package com.atguigu.controller;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.GetMapping;
/**
* @program: could2022
* @description:
* @author: 展大海
* @create: 2022-02-12 09:40
**/
@Controller
public class RouterController {
@GetMapping({"/", "index", "index.html"})
public String index() {
return "index";
}
@GetMapping("/level1/index")
public String level1() {
return "level1/index";
}
@GetMapping("/level2/index")
public String level2() {
return "level2/index";
}
@GetMapping("/level3/index")
public String level3() {
return "level3/index";
}
}
@SpringBootApplication
public class RouteSecurity9000 {
public static void main(String[] args) {
SpringApplication.run(RouteSecurity9000.class, args);
}
}
未导入security之前发现所有的页面都可以正常访问,导入spring-boot-starter-security发现程序直接来到了自带的登录页面
@EnableWebSecurity
public class SecurityConfig extends WebSecurityConfigurerAdapter {
//认证规则
@Override
protected void configure(AuthenticationManagerBuilder auth) throws Exception {
// 在新版本的SpringSecurity中新增了许多加密方法,不使用加密的话就会出现异常
// 这个例子模拟的是内存中的用户,真正开发中我们可以使用数据库
auth.inMemoryAuthentication()
.passwordEncoder(new BCryptPasswordEncoder())
.withUser("root").password(new BCryptPasswordEncoder().encode("12345")).roles("vip1", "vip2", "vip3")
.and()
.withUser("qianyu").password(new BCryptPasswordEncoder().encode("12345")).roles("vip1", "vip2")
.and()
.withUser("guest").password(new BCryptPasswordEncoder().encode("12345")).roles("vip1");
}
// 授权规则
@Override
protected void configure(HttpSecurity http) throws Exception {
// 添加请求授权规则
http.authorizeRequests()
// 首页所有人都可以访问
.antMatchers("/").permitAll()
// level1下的所有请求,vip1用户才能访问
.antMatchers("/level1/**").hasRole("vip1")
// level2下的所有请求,vip2用户才能访问
.antMatchers("/level2/**").hasRole("vip2")
// level3下的所有请求,vip3用户才能访问
.antMatchers("/level3/**").hasRole("vip3");
// 开启登录页面,即没有权限的话跳转到登录页面,对应地址:/login
http.formLogin();
// 开启注销功能
http.logout()
// 注销之后跳转到首页
.logoutSuccessUrl("/");
// 开启记住我功能,默认保存两周,底层使用cookie机制实现
http.rememberMe();
}
}
登录之后,不同权限的用户可以访问不同的页面
在需要的地方添加,然后使用即可
注销
前面我们的登录页面都是使用的SpringSecurity默认的,我们可以在配置类中修改成我们自定义的登录页面
resources/templates/login.html
这里的name属性默认是username和password,这里我们采用自定义的方式,/login是SpringSecurity默认的处理登录的Controller
login
在configure(HttpSecurity http)方法中添加如下内容,(注意这里我们要禁止csrf,否则登录会被拦截):
// 开启登录页面,即没有权限的话跳转到登录页面,对应地址:/login
http.formLogin()
// 登录页面
.loginPage("/toLogin")
// 用户名的name
.usernameParameter("user")
// 密码的name
.passwordParameter("pwd")
// 处理登录的Controller
.loginProcessingUrl("/login");
http.csrf().disable();
// 开启记住我功能,默认保存两周
http.rememberMe()
// name属性
.rememberMeParameter("remember");
@GetMapping("/toLogin")
public String toLogin(){
return "login";
}
此时,我们就可以使用自定义登录页面了
SpringSecurity使用的AOP的思想,我们在不用修改原来代码的基础上就可以实现原有代码功能的增强