Spring Security
SpringSecurity是一个能够为基于Spring的企业应用系统提供声明式的安全访问控制解决方案的安全框架。
为应用系统提供声明式的安全访问控制功能,减少了为企业系统安全控制编写大量重复代码的工作。
其核心就是一组过滤器链,项目启动后将会自动配置。
最核心的就是 Basic Authentication Filter 用来认证用户的身份,一个在spring security中一种过滤器处理一种认证方式。
几个重要的类
webSecurityConfiguration
: 自定义 security 策略AuthenticationManagerBuilder
: 自定义认证策略@EnableWebSecurity
: 开启 WebSecurity 模式
测试
1.导入依赖
xml
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-security</artifactId>
</dependency>
基本框架
java
@EnableWebSecurity
public class SecurityConfig extends WebSecurityConfigurerAdapter {
@Override
protected void configure(HttpSecurity http) throws Exception {
super.configure(http);
}
}
2.根据权限认证
java
@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();
}
java
//认证
@Override
protected void configure(AuthenticationManagerBuilder auth) throws Exception {
//jdbcAuthentication(),在数据库中认证
//inMemoryAuthentication()内存中认证
//passwordEncoder(new BCryptPasswordEncoder())给密码加密
auth.inMemoryAuthentication().passwordEncoder(new BCryptPasswordEncoder())
.withUser("admin").password(new BCryptPasswordEncoder().encode("123456")).roles("vip1","vip3");
}
如果注销404了,就是因为它默认防止csrf跨站请求伪造,因为会产生安全问题,我们可以将请求改为post表单提交,或者在spring security中关闭csrf功能;我们试试:在 配置中增加 http.csrf().disable();
http.csrf().disable();//关闭csrf功能:跨站请求伪造,默认只能通过post方式提交logout请求
http.logout().logoutSuccessUrl("/");
java
//没有权限默认到登录页
http.formLogin().loginProcessingUrl("/login");
//注销
http.logout().logoutSuccessUrl("/login");
动态权限控制
xml
<dependency>
<groupId>org.thymeleaf.extras</groupId>
<artifactId>thymeleaf-extras-springsecurity5</artifactId>
<version>3.0.4.RELEASE</version>
</dependency>
html
xmlns:sec="http://www.thymeleaf.org/thymeleaf-extras-springsecurity5"
sec:authorize="hasRole('vip3')"
/www.thymeleaf.org/thymeleaf-extras-springsecurity5"
sec:authorize="hasRole('vip3')"