废话不多说,开始总结学习的Spring-Security以及在使用过程中遇到的一些问题,使用过程中用到的有thymeleaf
1.遇到的问题(尚未解决)
就是在使用spring-security里面内置的logout的时候会提示404,只有http.csrf().disable();//关闭csrf功能
才能正常使用,不关闭无法使用内置的logout注销。
下面开始进入正题!Spring-Security初使用~
2.导入依赖
<!--相关依赖-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-security</artifactId>
</dependency>
<dependency>
<groupId>org.thymeleaf.extras</groupId>
<artifactId>thymeleaf-extras-springsecurity5</artifactId>
</dependency>
3.项目结构
4.Security相关配置以及使用
- SecurityConfig.java
@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")
.antMatchers("/level3/**").hasRole("vip3");
// 没有权限默认会到登录页面
http.formLogin().loginPage("/toLogin");
// 防止网站攻击
// http.csrf().disable();//关闭csrf功能
// 开启注销功能
http.logout().logoutSuccessUrl("/");
// 开启记住我功能
http.rememberMe().rememberMeParameter("remember");
}
//认证,在springboot 2.1.x中可以直接使用
//密码编码passwordEncoder
//在spring Security 5.0+ 新增了很多加密方式
@Override
protected void configure(AuthenticationManagerBuilder auth) throws Exception {
//这些数据正常应该从数据库中获取
auth.inMemoryAuthentication().passwordEncoder(new BCryptPasswordEncoder())
//配置用户权限
.withUser("admin").password(new BCryptPasswordEncoder().encode("123456")).roles("vip2","vip1","vip3")
.and()
.withUser("vip1").password(new BCryptPasswordEncoder().encode("vip1")).roles("vip1");
}
}
- controller.java
@RequestMapping({"/","/index"})
public String index(){
return "index";
}
@RequestMapping("/toLogin")
public String toLogin(){
return "views/login";
}
@RequestMapping("/level1/{id}")
public String level1(@PathVariable("id") int id){
return "views/level1/"+id;
}
@RequestMapping("/level2/{id}")
public String level2(@PathVariable("id") int id){
return "views/level2/"+id;
}
@RequestMapping("/level3/{id}")
public String level3(@PathVariable("id") int id){
return "views/level3/"+id;
}
前端页面就不过多的展示了,只展示部分
index.html(thymeleaf跟security有很好的支持)
5. 效果展示
- 1.未登录
- 2.登录admin用户
- 3.登录vip用户