默认的用户名是:user,密码会在控制台输出出来:
登录之后,正常进行业务:
如果我们不使用网页去调用接口,而是使用postman这类工具去调用接口该怎么进行认证呢?
默认情况下,SpringSecurity会接受请求头中的Authorization的值去进行认证,以Basic 开头,后接账号密码,比如在请求接口的时候,添加请求头Authorization:Basic user a76dbd63-65d2-4cff-aebc-cc5dc4a6973d
这样就不会被重定向到登陆页面,而是直接通过认证。
授权demoSpringSecurity默认配置下,所有接口只要认证通过即可访问,如果我们需要对一个接口进行限制,必须有哪一种权限才能访问,则需要进行安全配置
/** * @author 硝酸铜 * @date 2021/6/2 */ @EnableWebSecurity public class SecurityConfig extends WebSecurityConfigurerAdapter { @Override protected void configure(HttpSecurity http) throws Exception { http.authorizeRequests(req -> req.mvcMatchers("/api/greeting").hasAnyRole("ADMIN")); } }具体为什么这么写我们先不讨论,这里的意思就是访问/api/greeing这个路径需要有ADMIN这个角色,重新启动项目,访问该路径:
403禁止访问,未授权,没有该权限
我们现在给用户授权:
@Override protected void configure(HttpSecurity http) throws Exception { http .formLogin(Customizer.withDefaults()) ///api/greeting 路径需要检查认证信息 .authorizeRequests(req -> req.mvcMatchers("/api/greeting").authenticated()); }这里的意思是,我们不再检查权限,只检查该认证信息,重新启动,访问该路径:
这就是在SpringSecurity中的认证和授权的过程,其中的具体逻辑和源码,我们在后面进行详细学习,现在小伙伴们先了解个大概
安全配置一开始我们引入SS的时候,会生成默认的配置,比如默认的表单登录页面,HTTP BASIC认证等等,其本质就是WebSecurityConfigurerAdapter这个基类带来的配置
public abstract class WebSecurityConfigurerAdapter implements WebSecurityConfigurer<WebSecurity> { ... protected void configure(HttpSecurity http) throws Exception { this.logger.debug("Using default configure(HttpSecurity). If subclassed this will potentially override subclass configure(HttpSecurity)."); http.authorizeRequests((requests) -> { // 所有的接口都需要通过认证 ((AuthorizedUrl)requests.anyRequest()).authenticated(); }); // 默认的表单登陆页面 http.formLogin(); // 使用HTTP BASIC认证,也就是请求头中的Authorization:Basic username passowrd http.httpBasic(); } ... }这个默认的方法分为三个部分:
配置认证请求
配置表单
配置HttpBasic
这三个部分可以通过and()来连接,and()返回一个HttpSecurity,形成链式写法。
如果用函数式写法(推荐),直接就能使用链式写法。
如果我们需要自定义安全配置,则需要继承WebSecurityConfigurerAdapter这个基类,重写configure方法。
import org.springframework.security.config.Customizer; 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.config.annotation.web.configurers.AbstractHttpConfigurer; /** * `@EnableWebSecurity` 注解 deug参数为true时,开启调试模式,会有更多的debug输出,不要用在生产环境 * @author 硝酸铜 * @date 2021/6/2 */ @EnableWebSecurity(debug = true) public class SecurityConfig extends WebSecurityConfigurerAdapter { @Override protected void configure(HttpSecurity http) throws Exception { http //取消CSRF保护 .csrf(AbstractHttpConfigurer::disable) //默认的HTTP Basic Auth认证 .httpBasic(Customizer.withDefaults()) //默认的表单登录 //.formLogin(Customizer.withDefaults()) //关闭表单登录 .formLogin(AbstractHttpConfigurer::disable) //对 /api 路径下的所有接口进行验证,需要权限`ROLE_USER` .authorizeRequests(req -> req.antMatchers("/api/**").hasAnyRole("USER")); } @Override public void configure(WebSecurity web) { web .ignoring() .antMatchers("/error", "/resources/**", "/static/**", "/public/**", "/h2-console/**", "/swagger-ui.html", "/swagger-ui/**", "/v3/api-docs/**", "/v2/api-docs/**", "/doc.html", "/swagger-resources/**") .requestMatchers(PathRequest.toStaticResources().atCommonLocations()); } }重写configure(HttpSecurity http)让我们可以配置认证和授权,也就是说走到这个方法的时候,是经过了过滤器链的。