发布时间: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;
}
}
解决seaborn.load_dataset()导入数据时报错问题
南华大学计算机学院足球队,【体育学院】南华大学“新生杯”足球赛圆满落幕...
qiankun项目中子框架在window中挂载事件本地生效,但是运行在主应用下不生效解决办法
网页设计作业 旅游网站网站设计——绿色的随行旅游网站( 1页) 出行游玩网页设计作业,简单大学生静态HTML网页作品
《吐血整理》保姆级系列教程-玩转Fiddler抓包教程(6)-Fiddler状态面板详解
MyBatis教程[1]----项目构建并完成第一个查询操作
微服务项目实战技术点汇总:“尚硅谷的谷粒在线教育”十、微信扫码支付功能,
【文件处理】python实现将 gnt 格式的文件转换为 png 格式
从0开始的C语言入门教程day2(完结,让你0基础两天学会C语言)
java如何利用google的zxing生成二维码,只需要两步,超级简单