环境:SpringBoot2.7.12 + JDK21
Spring Security 是一个提供身份验证、授权和防护常见攻击的框架。它为确保命令式和反应式应用程序的安全提供一流的支持,是确保基于 Spring 的应用程序安全的事实标准。
Spring Scurity核心分为2大模块:
从Spring Security5.7开始之前的安全配置方式及Web授权处理方式发生了变化,接下来将详细介绍配置的变化。
在5.7之前的版本自定义安全配置通过如下方式:
@Componentpublic class SecurityConfig extends WebSecurityConfigurerAdapter { protected void configure(HttpSecurity http) throws Exception { // ... }}
在5.7之后推荐如下配置方式
@Configurationpublic class SecurityConfig { @Bean @Order(Ordered.HIGHEST_PRECEDENCE) SecurityFilterChain controllerFilterChain(HttpSecurity http) throws Exception { // ... return http.build() ; }}
通过配置安全过滤器链的方式配置,具体内部的配置细节还都是围绕着HttpSecurity进行配置。
在一个配置文件中我们可以非常方便的配置多个过滤器链,针对不同的请求进行拦截。
@Configurationpublic class SecurityConfig { @Bean @Order(1) SecurityFilterChain controllerFilterChain(HttpSecurity http) { // 当前过滤器链只对/demos/**, /login, /logout进行拦截 http.requestMatchers(matchers -> matchers.antMatchers("/demos/**", "/login", "/logout")) ; http.authorizeHttpRequests().antMatchers("/**").authenticated() ; http.formLogin(Customizer.withDefaults()) ; // ... return http.build() ; } @Bean @Order(2) SecurityFilterChain managementSecurityFilterChain(HttpSecurity http) throws Exception { // 该过滤器只会对/ac/**的请求进行拦截 http.requestMatchers(matchers -> matchers.antMatchers("/ac/**")) ; // ... http.formLogin(Customizer.withDefaults()); return http.build(); }}
以上配置了2个过滤器链,根据配置的@Order值,优先级分别:controllerFilterChain,managementSecurityFilterChain。当访问除上面指定的uri模式以为的请求都将自动放行。
在5.7版本之前,我们通过如下配置配置内存用户
public class SecurityConfig extends WebSecurityConfigurerAdapter { @Override protected void configure(AuthenticationManagerBuilder auth) throws Exception { auth.inMemoryAuthentication() .passwordEncoder(NoOpPasswordEncoder.getInstance()) .withUser("admin") .password("123123") .authorities(Arrays.asList(new SimpleGrantedAuthority("ROLE_ADMIN"))) ; }}
5.7 只有由于推荐的是通过自定义SecurityFilterChain的方式,所以我们需要通过如下的方式进行配置:
@Configurationpublic class SecurityConfig { @Bean @Order(0) SecurityFilterChain controllerFilterChain(HttpSecurity http) throws Exception { AuthenticationManagerBuilder builder = http.getSharedObject(AuthenticationManagerBuilder.class) ; builder.inMemoryAuthentication() .passwordEncoder(NoOpPasswordEncoder.getInstance()) .withUser("admin") .password("123123") .authorities(Arrays.asList(new SimpleGrantedAuthority("ROLE_ADMIN"))) ; // ... }}
在5.7之后推荐配置认证授权的方式如下
@Beanpublic SecurityFilterChain apiSecurityFilterChain(HttpSecurity http) throws Exception { http.authorizeHttpRequests().antMatchers("/users/**").hasAnyRole("ADMIN") ; // ... return http.build() ;}
通过上面的authorizeHttpRequests方式进行授权配置,会向过滤器链中添加AuthorizationFilter过滤器。在该过滤器中会进行权限的验证。
如果需要对请求的uri进行更加精确的匹配验证,如:/users/{id},需要验证只有这里的id值为666才方向。
@Beanpublic SecurityFilterChain apiSecurityFilterChain(HttpSecurity http) throws Exception { http.authorizeHttpRequests(registry -> { registry.antMatchers("/users/{id}").access(new AuthorizationManager<RequestAuthorizationContext>() { @Override public AuthorizationDecision check(Supplier<Authentication> authentication, RequestAuthorizationContext object) // 获取路径上的值信息,其中key=id,value=xxx Map<String, String> variables // 这里的第一个参数是boolean,确定了授权是否通过 return new AuthorityAuthorizationDecision(variables.get("id").equals("666"), Arrays.asList(new SimpleGrantedAuthority("D"))) ; } }) ; }) ;}
如果配置了多个不同的SecurityFilterChain,而每个认证都使用相同的用户体系,那么我们可以定义AuthenticationProvider或者UserDetailsService 类型的Bean即可。
@BeanUserDetailsService userDetailsService() { return new UserDetailsService() { @Override public UserDetails loadUserByUsername(String username) throws UsernameNotFoundException { return null; } } ;}@BeanAuthenticationProvider authenticationProvider() { return new AuthenticationProvider() { @Override public Authentication authenticate(Authentication authentication) throws AuthenticationException { return null; } @Override public boolean supports(Class<?> authentication) { return false; } } ;}
以上是本篇文章的全部内容, 希望对你有所帮助。
完毕!!!
本文链接:http://www.28at.com/showinfo-26-71943-0.html全新Spring Security安全管理配置使用详解
声明:本网页内容旨在传播知识,不代表本站观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。