SpringSecurity - 认证与授权
SpringSecurity是以认证与授权为主要功能的框架,与其类似的框架有apach shiro框架。
SpringBoot+SpringSecurity案例
引入依赖
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-thymeleaf</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-security</artifactId>
</dependency>
SpringSecurity配置
package com.inverseli.learning;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Configuration;
import org.springframework.security.config.annotation.authentication.builders.AuthenticationManagerBuilder;
import org.springframework.security.config.annotation.web.builders.HttpSecurity;
import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity;
import org.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter;
import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder;
/**
* @author liyuhao
* @date 2018年9月29日下午12:52:08
*/
@Configuration
@EnableWebSecurity
public class WebSecurityConfig extends WebSecurityConfigurerAdapter {
// 认证
@Override
protected void configure(HttpSecurity http) throws Exception {
http
.authorizeRequests()
.antMatchers("/")
// .hasRole(role)
.permitAll()
.anyRequest().authenticated()
.and()
.formLogin()
.loginPage("/login")
.permitAll()
.and()
.logout()
.permitAll();
}
// 授权
@Autowired
public void configureGlobal(AuthenticationManagerBuilder auth) throws Exception {
auth
.inMemoryAuthentication().passwordEncoder(new BCryptPasswordEncoder()).withUser("user1").password(new BCryptPasswordEncoder().encode("123456")).roles("USER");
}
}
配置详解
重写configure方法,进行认证功能实现
- authorizeRequests() 表示哪些请求需要进行认证,哪些请求不需要认证,除了请求 ' / ' 不需认证,其他请求都需要认证。
- hasRole() 判断用户角色,如果不符合角色权限,则拒绝访问请求
- .and() 就是连接作用,如果此处不用and,则使用如下方式
http
.authorizeRequests()
.antMatchers("/")
// .hasRole(role)
.permitAll()
.anyRequest().authenticated()
http
.formLogin()
.loginPage("/login")
.permitAll()
http
.logout()
.permitAll();
- http.formLogin() 开启默认登录页面,springboot自动生成login页面,把拦截的请求转到login进行用户登录,如果不开启登录,并且请求被拦截,就会报拒绝访问的错误,而不是转到login页面让用户登录。
- loginPage() 转到自定义登录界面,springboot默认为" /login "
- http.logout() 开启默认注销功能
- http.rememberMe() 开启记住我功能,登录之后把cookie储存在本地,下次登录只要cookie还在就能自动登录
configureGlobal - 授权
@Autowired
public void configureGlobal(AuthenticationManagerBuilder auth) throws Exception {
// 低版本授权
auth
.inMemoryAuthentication()
.withUser("user").password("password").roles("USER");
}
@Autowired
public void configureGlobal(AuthenticationManagerBuilder auth) throws Exception {
// 高些的版本授权
auth
.inMemoryAuthentication().passwordEncoder(new BCryptPasswordEncoder()).withUser("user1").password(new BCryptPasswordEncoder().encode("123456")).roles("USER");
}
踩坑
- 高版本的授权方式改变
- SpringSecurity中有很多默认实现,换成自定义实现时应避免冲突