发布时间:2023-06-26 16:00
Spring Security是一个能够为基于Spring的企业应用系统提供声明式的安全访问控制解决方案的安全框架。它提供了一组可以在Spring应用上下文中配置的Bean,充分利用了Spring IoC,DI(控制反转Inversion of Control ,DI:Dependency Injection 依赖注入)和AOP(面向切面编程)功能,为应用系统提供声明式的安全访问控制功能,减少了为企业系统安全控制编写大量重复代码的工作。
SpringSecurity的使用分为用户认证和授权以及权限控制,
首先来一个简单的入门,这里不连接数据库,用自定义用户名密码实现简单的拦截。
首先导入jar包,
//集成thymleaf的springsecurity5的jar包
org.thymeleaf.extras
thymeleaf-extras-springsecurity5
//security启动环境包
org.springframework.boot
spring-boot-starter-security
创建WebSecurityConfig配置类,加入@EnableWebSecurity注解,交给ioc管理,继承WebSecurityConfigurerAdapter类,重写方法
@EnableWebSecurity
public class WebSecurityConfig extends WebSecurityConfigurerAdapter {
/**
* 授权
* 角色对的才能访问的请求
* 此处拦截的请求为请求控制器的请求
*/
@Override
protected void configure(HttpSecurity http) throws Exception {
//设置那些请求携带哪些身份可以访问
http.authorizeHttpRequests()
.antMatchers("/").permitAll()
.antMatchers("/vip1/**").hasRole("vip1")
.antMatchers("/vip2/**").hasRole("vip2")
.antMatchers("/vip3/**").hasRole("vip3");
//当权限不足的时候跳转到哪里
http.exceptionHandling().accessDeniedPage("/toLogin");
//开启登录页认证
http.formLogin()
.failureUrl("/login/error")
.loginPage("/toLogin")
.loginProcessingUrl("/sLogin")
.usernameParameter("username")
.passwordParameter("password");
//开启CSRF防御后,开启CSRF防御后,访问"/login","/logout",都需要以post的方式
// post访问的请求需要验证请求中name为"_csrf"的值
//是否与当前session中存储的"_csrf"的token相同,所以我们需要携带一个隐藏域名为"_csrf"值为token
//token由spring Security自动生成并放在request的attribute中和session里面
http.csrf().disable();
//开启注销
http.logout().logoutSuccessUrl("/toLogin");
}
/**
* 认证
* 给用户名和密码匹配对的加入角色
*/
@Override
protected void configure(AuthenticationManagerBuilder auth) throws Exception {
auth.inMemoryAuthentication().passwordEncoder(new BCryptPasswordEncoder())
.withUser("lijiaqi").password(new BCryptPasswordEncoder().encode("123")).roles("vip1","vip2","vip3")
.and()
.withUser("vip1").password(new BCryptPasswordEncoder().encode("123")).roles("vip1")
.and()
.withUser("vip2").password(new BCryptPasswordEncoder().encode("123")).roles("vip2");
}
}
前端页面中
Title
用户名
角色
注销
vip3-add3
vip3-del3
vip3-up3
controller层的编写
@Controller
public class SecurityController {
/**
* 失败后跳转
*/
@RequestMapping("/login/error")
public String loginError(Model model){
model.addAttribute("error","账号密码错误");
return "views/login";
}
/**
* 失败后跳转
*/
@RequestMapping("/")
public String toIndex(){
return "index";
}
/**
* 去登陆页面
*/
@RequestMapping("toLogin")
public String toLogin(){
return "views/login";
}
/**
* restful风格编程
*/
@RequestMapping("vip1/{src}")
public String vip1(@PathVariable("src") String src){
return "views/vip1/"+src;
}
@RequestMapping("vip2/{src}")
public String vip2(@PathVariable("src")String src){
return "views/vip2/"+src;
}
@RequestMapping("vip3/{src}")
public String vip3(@PathVariable("src")String src){
return "views/vip3/"+src;
}
}